Commit 233eeade authored by jgruber's avatar jgruber Committed by Commit Bot

[builtins] Reduce register pressure in RecordWrite

Just a minor refactoring that loads parameters just prior to their
uses to reduce register spills and restores. CSA is not smart enough
to do this on its own.

Bug: v8:6666
Change-Id: I6d01abc35b333b2b0d99fa86daaa6ecb6afcf6c0
Reviewed-on: https://chromium-review.googlesource.com/1201883
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#55588}
parent 62766423
...@@ -350,17 +350,11 @@ class RecordWriteCodeStubAssembler : public CodeStubAssembler { ...@@ -350,17 +350,11 @@ class RecordWriteCodeStubAssembler : public CodeStubAssembler {
}; };
TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
Node* object = BitcastTaggedToWord(Parameter(Descriptor::kObject));
Node* slot = Parameter(Descriptor::kSlot);
Node* remembered_set = Parameter(Descriptor::kRememberedSet);
Node* fp_mode = Parameter(Descriptor::kFPMode);
Node* value = Load(MachineType::Pointer(), slot);
Label generational_wb(this); Label generational_wb(this);
Label incremental_wb(this); Label incremental_wb(this);
Label exit(this); Label exit(this);
Node* remembered_set = Parameter(Descriptor::kRememberedSet);
Branch(ShouldEmitRememberSet(remembered_set), &generational_wb, Branch(ShouldEmitRememberSet(remembered_set), &generational_wb,
&incremental_wb); &incremental_wb);
...@@ -368,22 +362,27 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { ...@@ -368,22 +362,27 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
{ {
Label test_old_to_new_flags(this); Label test_old_to_new_flags(this);
Label store_buffer_exit(this), store_buffer_incremental_wb(this); Label store_buffer_exit(this), store_buffer_incremental_wb(this);
// When incremental marking is not on, we skip cross generation pointer // When incremental marking is not on, we skip cross generation pointer
// checking here, because there are checks for // checking here, because there are checks for
// `kPointersFromHereAreInterestingMask` and // `kPointersFromHereAreInterestingMask` and
// `kPointersToHereAreInterestingMask` in // `kPointersToHereAreInterestingMask` in
// `src/compiler/<arch>/code-generator-<arch>.cc` before calling this stub, // `src/compiler/<arch>/code-generator-<arch>.cc` before calling this stub,
// which serves as the cross generation checking. // which serves as the cross generation checking.
Node* slot = Parameter(Descriptor::kSlot);
Branch(IsMarking(), &test_old_to_new_flags, &store_buffer_exit); Branch(IsMarking(), &test_old_to_new_flags, &store_buffer_exit);
BIND(&test_old_to_new_flags); BIND(&test_old_to_new_flags);
{ {
Node* value = Load(MachineType::Pointer(), slot);
// TODO(albertnetymk): Try to cache the page flag for value and object, // TODO(albertnetymk): Try to cache the page flag for value and object,
// instead of calling IsPageFlagSet each time. // instead of calling IsPageFlagSet each time.
Node* value_in_new_space = Node* value_in_new_space =
IsPageFlagSet(value, MemoryChunk::kIsInNewSpaceMask); IsPageFlagSet(value, MemoryChunk::kIsInNewSpaceMask);
GotoIfNot(value_in_new_space, &incremental_wb); GotoIfNot(value_in_new_space, &incremental_wb);
Node* object = BitcastTaggedToWord(Parameter(Descriptor::kObject));
Node* object_in_new_space = Node* object_in_new_space =
IsPageFlagSet(object, MemoryChunk::kIsInNewSpaceMask); IsPageFlagSet(object, MemoryChunk::kIsInNewSpaceMask);
Branch(object_in_new_space, &incremental_wb, Branch(object_in_new_space, &incremental_wb,
...@@ -394,6 +393,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { ...@@ -394,6 +393,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
{ {
Node* isolate_constant = Node* isolate_constant =
ExternalConstant(ExternalReference::isolate_address(isolate())); ExternalConstant(ExternalReference::isolate_address(isolate()));
Node* fp_mode = Parameter(Descriptor::kFPMode);
InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode, &exit); InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode, &exit);
} }
...@@ -401,6 +401,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { ...@@ -401,6 +401,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
{ {
Node* isolate_constant = Node* isolate_constant =
ExternalConstant(ExternalReference::isolate_address(isolate())); ExternalConstant(ExternalReference::isolate_address(isolate()));
Node* fp_mode = Parameter(Descriptor::kFPMode);
InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode, InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode,
&incremental_wb); &incremental_wb);
} }
...@@ -410,6 +411,9 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { ...@@ -410,6 +411,9 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
{ {
Label call_incremental_wb(this); Label call_incremental_wb(this);
Node* slot = Parameter(Descriptor::kSlot);
Node* value = Load(MachineType::Pointer(), slot);
// There are two cases we need to call incremental write barrier. // There are two cases we need to call incremental write barrier.
// 1) value_is_white // 1) value_is_white
GotoIf(IsWhite(value), &call_incremental_wb); GotoIf(IsWhite(value), &call_incremental_wb);
...@@ -418,6 +422,8 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { ...@@ -418,6 +422,8 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
// is_compacting = true when is_marking = true // is_compacting = true when is_marking = true
GotoIfNot(IsPageFlagSet(value, MemoryChunk::kEvacuationCandidateMask), GotoIfNot(IsPageFlagSet(value, MemoryChunk::kEvacuationCandidateMask),
&exit); &exit);
Node* object = BitcastTaggedToWord(Parameter(Descriptor::kObject));
Branch( Branch(
IsPageFlagSet(object, MemoryChunk::kSkipEvacuationSlotsRecordingMask), IsPageFlagSet(object, MemoryChunk::kSkipEvacuationSlotsRecordingMask),
&exit, &call_incremental_wb); &exit, &call_incremental_wb);
...@@ -428,6 +434,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { ...@@ -428,6 +434,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
ExternalReference::incremental_marking_record_write_function()); ExternalReference::incremental_marking_record_write_function());
Node* isolate_constant = Node* isolate_constant =
ExternalConstant(ExternalReference::isolate_address(isolate())); ExternalConstant(ExternalReference::isolate_address(isolate()));
Node* fp_mode = Parameter(Descriptor::kFPMode);
CallCFunction3WithCallerSavedRegistersMode( CallCFunction3WithCallerSavedRegistersMode(
MachineType::Int32(), MachineType::Pointer(), MachineType::Pointer(), MachineType::Int32(), MachineType::Pointer(), MachineType::Pointer(),
MachineType::Pointer(), function, object, slot, isolate_constant, MachineType::Pointer(), function, object, slot, isolate_constant,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment