Skip to content

Commit

Permalink
[maglev] Make StoreDoubleField and StoreFixedDoubleArrayElement arch …
Browse files Browse the repository at this point in the history
…independent

Bug: v8:7700
Change-Id: Ie14f897f8a6b9abc173cec805c442d76291ea9dc
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4642192
Auto-Submit: Victor Gomes <victorgomes@chromium.org>
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Commit-Queue: Victor Gomes <victorgomes@chromium.org>
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/main@{#88489}
  • Loading branch information
victorgomes authored and V8 LUCI CQ committed Jun 26, 2023
1 parent b084a99 commit 297f933
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 100 deletions.
8 changes: 8 additions & 0 deletions src/maglev/arm/maglev-assembler-arm-inl.h
Expand Up @@ -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) {
Expand Down
20 changes: 0 additions & 20 deletions src/maglev/arm/maglev-ir-arm.cc
Expand Up @@ -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());
Expand Down
8 changes: 8 additions & 0 deletions src/maglev/arm64/maglev-assembler-arm64-inl.h
Expand Up @@ -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) {
Expand Down
40 changes: 0 additions & 40 deletions src/maglev/arm64/maglev-ir-arm64.cc
Expand Up @@ -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());
Expand Down
2 changes: 2 additions & 0 deletions src/maglev/maglev-assembler.h
Expand Up @@ -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);
Expand Down
38 changes: 38 additions & 0 deletions src/maglev/maglev-ir.cc
Expand Up @@ -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();
}
Expand Down Expand Up @@ -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);
}
Expand Down
6 changes: 6 additions & 0 deletions src/maglev/x64/maglev-assembler-x64-inl.h
Expand Up @@ -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) {
Expand Down
40 changes: 0 additions & 40 deletions src/maglev/x64/maglev-ir-x64.cc
Expand Up @@ -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());
Expand Down Expand Up @@ -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());
Expand Down

0 comments on commit 297f933

Please sign in to comment.