Remove isolate parameter from RecordWrite builtin
The isolate can be efficiently loaded through other means: either as a root-relative load (if embedded builtins are enabled), or as an embedded external reference (i.e. the absolute pointer is included in the instruction stream) otherwise. The generated code should be at least as fast as previously. On x64 (with embedded builtins): Before: // Register moves in prologue: 0x7f47a6b4860a a 488955e0 REX.W movq [rbp-0x20],rdx // And the load from a stack slot at each use-site. 0x7f47a6b486f2 f2 488b7de0 REX.W movq rdi,[rbp-0x20] After: // Each use-site just loads a root-relative offset. 0x7f1645fcc6ce ee 498dbd38ffffff REX.W leaq rdi,[r13-0xc8] On ia32 (no embedded builtins), before: 0x5c608930 10 8955f0 mov [ebp-0x10],edx 0x5c6089fb db 891424 mov [esp],edx After: 0x41d0898d 8d b80033b156 mov eax,0x56b13300 Removal reduces register pressure, and frees up ebx as the root register on ia32. Note that the set of allocatable registers was only reduced on ia32 to exclude the root register. Bug: v8:6666 Change-Id: I14e401e2823c82042c76acae10c3c935b9982993 Reviewed-on: https://chromium-review.googlesource.com/1201586 Commit-Queue: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Ulan Degenbaev <ulan@chromium.org> Cr-Commit-Position: refs/heads/master@{#55587}
This commit is contained in:
parent
3ca12ea465
commit
6276642357
@ -615,8 +615,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
RecordWriteDescriptor::kObject));
|
||||
Register slot_parameter(
|
||||
callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot));
|
||||
Register isolate_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kIsolate));
|
||||
Register remembered_set_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kRememberedSet));
|
||||
Register fp_mode_parameter(callable.descriptor().GetRegisterParameter(
|
||||
@ -628,7 +626,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
Pop(slot_parameter);
|
||||
Pop(object_parameter);
|
||||
|
||||
Move(isolate_parameter, ExternalReference::isolate_address(isolate()));
|
||||
Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
|
||||
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(callable.code(), RelocInfo::CODE_TARGET);
|
||||
|
@ -2823,8 +2823,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
RecordWriteDescriptor::kObject));
|
||||
Register slot_parameter(
|
||||
callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot));
|
||||
Register isolate_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kIsolate));
|
||||
Register remembered_set_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kRememberedSet));
|
||||
Register fp_mode_parameter(callable.descriptor().GetRegisterParameter(
|
||||
@ -2834,7 +2832,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
|
||||
Pop(slot_parameter, object_parameter);
|
||||
|
||||
Mov(isolate_parameter, ExternalReference::isolate_address(isolate()));
|
||||
Mov(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
|
||||
Mov(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(callable.code(), RelocInfo::CODE_TARGET);
|
||||
|
@ -352,7 +352,6 @@ class RecordWriteCodeStubAssembler : public CodeStubAssembler {
|
||||
TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
|
||||
Node* object = BitcastTaggedToWord(Parameter(Descriptor::kObject));
|
||||
Node* slot = Parameter(Descriptor::kSlot);
|
||||
Node* isolate = Parameter(Descriptor::kIsolate);
|
||||
Node* remembered_set = Parameter(Descriptor::kRememberedSet);
|
||||
Node* fp_mode = Parameter(Descriptor::kFPMode);
|
||||
|
||||
@ -387,16 +386,24 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
|
||||
|
||||
Node* object_in_new_space =
|
||||
IsPageFlagSet(object, MemoryChunk::kIsInNewSpaceMask);
|
||||
GotoIf(object_in_new_space, &incremental_wb);
|
||||
|
||||
Goto(&store_buffer_incremental_wb);
|
||||
Branch(object_in_new_space, &incremental_wb,
|
||||
&store_buffer_incremental_wb);
|
||||
}
|
||||
|
||||
BIND(&store_buffer_exit);
|
||||
{ InsertToStoreBufferAndGoto(isolate, slot, fp_mode, &exit); }
|
||||
{
|
||||
Node* isolate_constant =
|
||||
ExternalConstant(ExternalReference::isolate_address(isolate()));
|
||||
InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode, &exit);
|
||||
}
|
||||
|
||||
BIND(&store_buffer_incremental_wb);
|
||||
{ InsertToStoreBufferAndGoto(isolate, slot, fp_mode, &incremental_wb); }
|
||||
{
|
||||
Node* isolate_constant =
|
||||
ExternalConstant(ExternalReference::isolate_address(isolate()));
|
||||
InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode,
|
||||
&incremental_wb);
|
||||
}
|
||||
}
|
||||
|
||||
BIND(&incremental_wb);
|
||||
@ -411,20 +418,20 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
|
||||
// is_compacting = true when is_marking = true
|
||||
GotoIfNot(IsPageFlagSet(value, MemoryChunk::kEvacuationCandidateMask),
|
||||
&exit);
|
||||
GotoIf(
|
||||
Branch(
|
||||
IsPageFlagSet(object, MemoryChunk::kSkipEvacuationSlotsRecordingMask),
|
||||
&exit);
|
||||
|
||||
Goto(&call_incremental_wb);
|
||||
&exit, &call_incremental_wb);
|
||||
|
||||
BIND(&call_incremental_wb);
|
||||
{
|
||||
Node* function = ExternalConstant(
|
||||
ExternalReference::incremental_marking_record_write_function());
|
||||
Node* isolate_constant =
|
||||
ExternalConstant(ExternalReference::isolate_address(isolate()));
|
||||
CallCFunction3WithCallerSavedRegistersMode(
|
||||
MachineType::Int32(), MachineType::Pointer(), MachineType::Pointer(),
|
||||
MachineType::Pointer(), function, object, slot, isolate, fp_mode,
|
||||
&exit);
|
||||
MachineType::Pointer(), function, object, slot, isolate_constant,
|
||||
fp_mode, &exit);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@ void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
|
||||
|
||||
void RecordWriteDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
static const Register default_stub_registers[] = {ebx, ecx, edx, edi,
|
||||
static const Register default_stub_registers[] = {ecx, edx, edi,
|
||||
kReturnRegister0};
|
||||
|
||||
data->RestrictAllocatableRegisters(default_stub_registers,
|
||||
|
@ -326,8 +326,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
RecordWriteDescriptor::kObject));
|
||||
Register slot_parameter(
|
||||
callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot));
|
||||
Register isolate_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kIsolate));
|
||||
Register remembered_set_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kRememberedSet));
|
||||
Register fp_mode_parameter(callable.descriptor().GetRegisterParameter(
|
||||
@ -339,8 +337,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
pop(slot_parameter);
|
||||
pop(object_parameter);
|
||||
|
||||
mov(isolate_parameter,
|
||||
Immediate(ExternalReference::isolate_address(isolate())));
|
||||
Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
|
||||
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(callable.code(), RelocInfo::CODE_TARGET);
|
||||
|
@ -654,13 +654,9 @@ class FastNewObjectDescriptor : public CallInterfaceDescriptor {
|
||||
|
||||
class RecordWriteDescriptor final : public CallInterfaceDescriptor {
|
||||
public:
|
||||
// TODO(v8:6666): Remove the isolate argument once kRootRegister is
|
||||
// fully supported on ia32. Then the isolate can be determined through a
|
||||
// simple register addition instead.
|
||||
DEFINE_PARAMETERS(kObject, kSlot, kIsolate, kRememberedSet, kFPMode)
|
||||
DEFINE_PARAMETERS(kObject, kSlot, kRememberedSet, kFPMode)
|
||||
DEFINE_PARAMETER_TYPES(MachineType::TaggedPointer(), // kObject
|
||||
MachineType::Pointer(), // kSlot
|
||||
MachineType::Pointer(), // kIsolate
|
||||
MachineType::TaggedSigned(), // kRememberedSet
|
||||
MachineType::TaggedSigned()) // kFPMode
|
||||
|
||||
|
@ -273,8 +273,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
RecordWriteDescriptor::kObject));
|
||||
Register slot_parameter(
|
||||
callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot));
|
||||
Register isolate_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kIsolate));
|
||||
Register remembered_set_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kRememberedSet));
|
||||
Register fp_mode_parameter(callable.descriptor().GetRegisterParameter(
|
||||
@ -286,7 +284,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
Pop(slot_parameter);
|
||||
Pop(object_parameter);
|
||||
|
||||
li(isolate_parameter, ExternalReference::isolate_address(isolate()));
|
||||
Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
|
||||
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(callable.code(), RelocInfo::CODE_TARGET);
|
||||
|
@ -273,8 +273,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
RecordWriteDescriptor::kObject));
|
||||
Register slot_parameter(
|
||||
callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot));
|
||||
Register isolate_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kIsolate));
|
||||
Register remembered_set_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kRememberedSet));
|
||||
Register fp_mode_parameter(callable.descriptor().GetRegisterParameter(
|
||||
@ -286,7 +284,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
Pop(slot_parameter);
|
||||
Pop(object_parameter);
|
||||
|
||||
li(isolate_parameter, ExternalReference::isolate_address(isolate()));
|
||||
Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
|
||||
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(callable.code(), RelocInfo::CODE_TARGET);
|
||||
|
@ -483,8 +483,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
RecordWriteDescriptor::kObject));
|
||||
Register slot_parameter(
|
||||
callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot));
|
||||
Register isolate_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kIsolate));
|
||||
Register remembered_set_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kRememberedSet));
|
||||
Register fp_mode_parameter(callable.descriptor().GetRegisterParameter(
|
||||
@ -496,7 +494,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
pop(slot_parameter);
|
||||
pop(object_parameter);
|
||||
|
||||
Move(isolate_parameter, ExternalReference::isolate_address(isolate()));
|
||||
Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
|
||||
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(callable.code(), RelocInfo::CODE_TARGET);
|
||||
|
@ -514,8 +514,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
RecordWriteDescriptor::kObject));
|
||||
Register slot_parameter(
|
||||
callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot));
|
||||
Register isolate_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kIsolate));
|
||||
Register remembered_set_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kRememberedSet));
|
||||
Register fp_mode_parameter(callable.descriptor().GetRegisterParameter(
|
||||
@ -527,7 +525,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
Pop(slot_parameter);
|
||||
Pop(object_parameter);
|
||||
|
||||
Move(isolate_parameter, ExternalReference::isolate_address(isolate()));
|
||||
Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
|
||||
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(callable.code(), RelocInfo::CODE_TARGET);
|
||||
|
@ -285,8 +285,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
RecordWriteDescriptor::kObject));
|
||||
Register slot_parameter(
|
||||
callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot));
|
||||
Register isolate_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kIsolate));
|
||||
Register remembered_set_parameter(callable.descriptor().GetRegisterParameter(
|
||||
RecordWriteDescriptor::kRememberedSet));
|
||||
Register fp_mode_parameter(callable.descriptor().GetRegisterParameter(
|
||||
@ -311,8 +309,6 @@ void TurboAssembler::CallRecordWriteStub(
|
||||
xchgq(slot_parameter, object_parameter);
|
||||
}
|
||||
|
||||
LoadAddress(isolate_parameter, ExternalReference::isolate_address(isolate()));
|
||||
|
||||
Smi* smi_rsa = Smi::FromEnum(remembered_set_action);
|
||||
Smi* smi_fm = Smi::FromEnum(fp_mode);
|
||||
Move(remembered_set_parameter, smi_rsa);
|
||||
|
Loading…
Reference in New Issue
Block a user