From 297f933c68b3992ba3ea35fe04e2bd8bd220baff Mon Sep 17 00:00:00 2001 From: Victor Gomes Date: Mon, 26 Jun 2023 16:39:28 +0200 Subject: [PATCH] [maglev] Make StoreDoubleField and StoreFixedDoubleArrayElement arch independent Bug: v8:7700 Change-Id: Ie14f897f8a6b9abc173cec805c442d76291ea9dc Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4642192 Auto-Submit: Victor Gomes Reviewed-by: Leszek Swirski Commit-Queue: Victor Gomes Commit-Queue: Leszek Swirski Cr-Commit-Position: refs/heads/main@{#88489} --- src/maglev/arm/maglev-assembler-arm-inl.h | 8 ++++ src/maglev/arm/maglev-ir-arm.cc | 20 ---------- src/maglev/arm64/maglev-assembler-arm64-inl.h | 8 ++++ src/maglev/arm64/maglev-ir-arm64.cc | 40 ------------------- src/maglev/maglev-assembler.h | 2 + src/maglev/maglev-ir.cc | 38 ++++++++++++++++++ src/maglev/x64/maglev-assembler-x64-inl.h | 6 +++ src/maglev/x64/maglev-ir-x64.cc | 40 ------------------- 8 files changed, 62 insertions(+), 100 deletions(-) diff --git a/src/maglev/arm/maglev-assembler-arm-inl.h b/src/maglev/arm/maglev-assembler-arm-inl.h index d09fb03e083c..15be6bd1ce47 100644 --- a/src/maglev/arm/maglev-assembler-arm-inl.h +++ b/src/maglev/arm/maglev-assembler-arm-inl.h @@ -358,6 +358,14 @@ void MaglevAssembler::LoadFixedDoubleArrayElement(DoubleRegister result, vldr(result, FieldMemOperand(scratch, FixedArray::kHeaderSize)); } +inline void MaglevAssembler::StoreFixedDoubleArrayElement( + Register array, Register index, DoubleRegister value) { + ScratchRegisterScope temps(this); + Register scratch = temps.Acquire(); + add(scratch, array, Operand(index, LSL, kDoubleSizeLog2)); + vstr(value, FieldMemOperand(scratch, FixedArray::kHeaderSize)); +} + inline void MaglevAssembler::LoadSignedField(Register result, MemOperand operand, int size) { if (size == 1) { diff --git a/src/maglev/arm/maglev-ir-arm.cc b/src/maglev/arm/maglev-ir-arm.cc index c5b048235c32..429f37670b76 100644 --- a/src/maglev/arm/maglev-ir-arm.cc +++ b/src/maglev/arm/maglev-ir-arm.cc @@ -591,26 +591,6 @@ void ReduceInterruptBudgetForReturn::GenerateCode( amount()); } -void StoreFixedDoubleArrayElement::SetValueLocationConstraints() { - UseRegister(elements_input()); - UseRegister(index_input()); - UseRegister(value_input()); - set_temporaries_needed(1); -} -void StoreFixedDoubleArrayElement::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - MAGLEV_NODE_NOT_IMPLEMENTED(StoreFixedDoubleArrayElement); -} - -void StoreDoubleField::SetValueLocationConstraints() { - UseRegister(object_input()); - UseRegister(value_input()); -} -void StoreDoubleField::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - MAGLEV_NODE_NOT_IMPLEMENTED(StoreDoubleField); -} - void LoadSignedIntDataViewElement::SetValueLocationConstraints() { UseRegister(object_input()); UseRegister(index_input()); diff --git a/src/maglev/arm64/maglev-assembler-arm64-inl.h b/src/maglev/arm64/maglev-assembler-arm64-inl.h index 5be4de772afa..328cf69736c1 100644 --- a/src/maglev/arm64/maglev-assembler-arm64-inl.h +++ b/src/maglev/arm64/maglev-assembler-arm64-inl.h @@ -468,6 +468,14 @@ void MaglevAssembler::LoadFixedDoubleArrayElement(DoubleRegister result, Ldr(result, FieldMemOperand(scratch, FixedArray::kHeaderSize)); } +inline void MaglevAssembler::StoreFixedDoubleArrayElement( + Register array, Register index, DoubleRegister value) { + ScratchRegisterScope temps(this); + Register scratch = temps.Acquire(); + Add(scratch, array, Operand(index, LSL, kDoubleSizeLog2)); + Str(value, FieldMemOperand(scratch, FixedArray::kHeaderSize)); +} + inline void MaglevAssembler::LoadSignedField(Register result, MemOperand operand, int size) { if (size == 1) { diff --git a/src/maglev/arm64/maglev-ir-arm64.cc b/src/maglev/arm64/maglev-ir-arm64.cc index 363055e06c5e..e036379d3fea 100644 --- a/src/maglev/arm64/maglev-ir-arm64.cc +++ b/src/maglev/arm64/maglev-ir-arm64.cc @@ -921,46 +921,6 @@ void ReduceInterruptBudgetForReturn::GenerateCode( amount()); } -void StoreFixedDoubleArrayElement::SetValueLocationConstraints() { - UseRegister(elements_input()); - UseRegister(index_input()); - UseRegister(value_input()); - set_temporaries_needed(1); -} -void StoreFixedDoubleArrayElement::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - Register elements = ToRegister(elements_input()); - Register index = ToRegister(index_input()); - DoubleRegister value = ToDoubleRegister(value_input()); - MaglevAssembler::ScratchRegisterScope temps(masm); - Register scratch = temps.Acquire(); - if (v8_flags.debug_code) { - __ AssertNotSmi(elements); - __ IsObjectType(elements, FIXED_DOUBLE_ARRAY_TYPE); - __ Assert(eq, AbortReason::kUnexpectedValue); - } - __ Add(scratch, elements, Operand(index, LSL, kDoubleSizeLog2)); - __ Str(value, FieldMemOperand(scratch, FixedArray::kHeaderSize)); -} - -void StoreDoubleField::SetValueLocationConstraints() { - UseRegister(object_input()); - UseRegister(value_input()); -} -void StoreDoubleField::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - Register object = ToRegister(object_input()); - DoubleRegister value = ToDoubleRegister(value_input()); - - MaglevAssembler::ScratchRegisterScope temps(masm); - Register tmp = temps.Acquire(); - - __ AssertNotSmi(object); - __ DecompressTagged(tmp, FieldMemOperand(object, offset())); - __ AssertNotSmi(tmp); - __ StoreFloat64(FieldMemOperand(tmp, HeapNumber::kValueOffset), value); -} - void LoadSignedIntDataViewElement::SetValueLocationConstraints() { UseRegister(object_input()); UseRegister(index_input()); diff --git a/src/maglev/maglev-assembler.h b/src/maglev/maglev-assembler.h index fd2782af133e..53c385819646 100644 --- a/src/maglev/maglev-assembler.h +++ b/src/maglev/maglev-assembler.h @@ -155,6 +155,8 @@ class MaglevAssembler : public MacroAssembler { Register index); inline void LoadFixedDoubleArrayElement(DoubleRegister result, Register array, Register index); + inline void StoreFixedDoubleArrayElement(Register array, Register index, + DoubleRegister value); inline void LoadSignedField(Register result, MemOperand operand, int element_size); diff --git a/src/maglev/maglev-ir.cc b/src/maglev/maglev-ir.cc index 95aec3e59660..b083ff69086d 100644 --- a/src/maglev/maglev-ir.cc +++ b/src/maglev/maglev-ir.cc @@ -1997,6 +1997,26 @@ void LoadHoleyFixedDoubleArrayElement::GenerateCode( __ LoadFixedDoubleArrayElement(result_reg, elements, index); } +void StoreFixedDoubleArrayElement::SetValueLocationConstraints() { + UseRegister(elements_input()); + UseRegister(index_input()); + UseRegister(value_input()); +} +void StoreFixedDoubleArrayElement::GenerateCode(MaglevAssembler* masm, + const ProcessingState& state) { + Register elements = ToRegister(elements_input()); + Register index = ToRegister(index_input()); + DoubleRegister value = ToDoubleRegister(value_input()); + if (v8_flags.debug_code) { + __ AssertNotSmi(elements); + __ IsObjectType(elements, FIXED_DOUBLE_ARRAY_TYPE); + __ Assert(kEqual, AbortReason::kUnexpectedValue); + __ CompareInt32(index, 0); + __ Assert(kUnsignedGreaterThanEqual, AbortReason::kUnexpectedNegativeValue); + } + __ StoreFixedDoubleArrayElement(elements, index, value); +} + int StoreMap::MaxCallStackArgs() const { return WriteBarrierDescriptor::GetStackParameterCount(); } @@ -4539,6 +4559,24 @@ void SetPendingMessage::GenerateCode(MaglevAssembler* masm, } } +void StoreDoubleField::SetValueLocationConstraints() { + UseRegister(object_input()); + UseRegister(value_input()); +} +void StoreDoubleField::GenerateCode(MaglevAssembler* masm, + const ProcessingState& state) { + Register object = ToRegister(object_input()); + DoubleRegister value = ToDoubleRegister(value_input()); + + MaglevAssembler::ScratchRegisterScope temps(masm); + Register tmp = temps.GetDefaultScratchRegister(); + + __ AssertNotSmi(object); + __ DecompressTagged(tmp, FieldMemOperand(object, offset())); + __ AssertNotSmi(tmp); + __ StoreFloat64(FieldMemOperand(tmp, HeapNumber::kValueOffset), value); +} + int TransitionElementsKindOrCheckMap::MaxCallStackArgs() const { return std::max(WriteBarrierDescriptor::GetStackParameterCount(), 2); } diff --git a/src/maglev/x64/maglev-assembler-x64-inl.h b/src/maglev/x64/maglev-assembler-x64-inl.h index 5b863d949c4f..c06cb643bfeb 100644 --- a/src/maglev/x64/maglev-assembler-x64-inl.h +++ b/src/maglev/x64/maglev-assembler-x64-inl.h @@ -362,6 +362,12 @@ void MaglevAssembler::LoadFixedDoubleArrayElement(DoubleRegister result, FieldOperand(array, index, times_8, FixedDoubleArray::kHeaderSize)); } +inline void MaglevAssembler::StoreFixedDoubleArrayElement( + Register array, Register index, DoubleRegister value) { + Movsd(FieldOperand(array, index, times_8, FixedDoubleArray::kHeaderSize), + value); +} + inline void MaglevAssembler::LoadSignedField(Register result, Operand operand, int size) { if (size == 1) { diff --git a/src/maglev/x64/maglev-ir-x64.cc b/src/maglev/x64/maglev-ir-x64.cc index 487ede86c593..4e75a0162d91 100644 --- a/src/maglev/x64/maglev-ir-x64.cc +++ b/src/maglev/x64/maglev-ir-x64.cc @@ -232,28 +232,6 @@ void BuiltinStringPrototypeCharCodeOrCodePointAt::GenerateCode( __ bind(*done); } -void StoreFixedDoubleArrayElement::SetValueLocationConstraints() { - UseRegister(elements_input()); - UseRegister(index_input()); - UseRegister(value_input()); -} -void StoreFixedDoubleArrayElement::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - Register elements = ToRegister(elements_input()); - Register index = ToRegister(index_input()); - DoubleRegister value = ToDoubleRegister(value_input()); - if (v8_flags.debug_code) { - __ AssertNotSmi(elements); - __ CmpObjectType(elements, FIXED_DOUBLE_ARRAY_TYPE, kScratchRegister); - __ Assert(equal, AbortReason::kUnexpectedValue); - __ cmpq(index, Immediate(0)); - __ Assert(above_equal, AbortReason::kUnexpectedNegativeValue); - } - __ Movsd( - FieldOperand(elements, index, times_8, FixedDoubleArray::kHeaderSize), - value); -} - void LoadSignedIntDataViewElement::SetValueLocationConstraints() { UseRegister(object_input()); UseRegister(index_input()); @@ -486,24 +464,6 @@ void StoreDoubleDataViewElement::GenerateCode(MaglevAssembler* masm, } } -void StoreDoubleField::SetValueLocationConstraints() { - UseRegister(object_input()); - UseRegister(value_input()); - set_temporaries_needed(1); -} -void StoreDoubleField::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - MaglevAssembler::ScratchRegisterScope temps(masm); - Register tmp = temps.Acquire(); - Register object = ToRegister(object_input()); - DoubleRegister value = ToDoubleRegister(value_input()); - - __ AssertNotSmi(object); - __ DecompressTagged(tmp, FieldOperand(object, offset())); - __ AssertNotSmi(tmp); - __ Movsd(FieldOperand(tmp, HeapNumber::kValueOffset), value); -} - void Int32AddWithOverflow::SetValueLocationConstraints() { UseRegister(left_input()); UseRegister(right_input());