From f0ee648ca774f3ec6ce493880ef88f912d537f2c Mon Sep 17 00:00:00 2001 From: Victor Gomes Date: Tue, 27 Jun 2023 17:04:11 +0200 Subject: [PATCH] [maglev] Make (U)Int32ToNumber arch independent Avoid unecessary moves when output does not alias input. Bug: v8:7700 Change-Id: I548e17d748916f608f82dc23f47977a80211965b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4651032 Commit-Queue: Leszek Swirski Auto-Submit: Victor Gomes Reviewed-by: Leszek Swirski Cr-Commit-Position: refs/heads/main@{#88510} --- src/maglev/arm/maglev-ir-arm.cc | 39 ----------------- src/maglev/arm64/maglev-ir-arm64.cc | 55 ------------------------ src/maglev/maglev-ir.cc | 66 +++++++++++++++++++++++++++++ src/maglev/x64/maglev-ir-x64.cc | 50 ---------------------- 4 files changed, 66 insertions(+), 144 deletions(-) diff --git a/src/maglev/arm/maglev-ir-arm.cc b/src/maglev/arm/maglev-ir-arm.cc index f53f7551a6c3..b4808dc5f2f7 100644 --- a/src/maglev/arm/maglev-ir-arm.cc +++ b/src/maglev/arm/maglev-ir-arm.cc @@ -171,45 +171,6 @@ void CheckNumber::GenerateCode(MaglevAssembler* masm, int CheckedObjectToIndex::MaxCallStackArgs() const { return 0; } -void Int32ToNumber::SetValueLocationConstraints() { - UseRegister(input()); - DefineAsRegister(this); -} -void Int32ToNumber::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - ZoneLabelRef done(masm); - Register object = ToRegister(result()); - Register value = ToRegister(input()); - MaglevAssembler::ScratchRegisterScope temps(masm); - Register scratch = temps.Acquire(); - __ add(scratch, value, value, SetCC); - __ JumpToDeferredIf( - vs, - [](MaglevAssembler* masm, Register object, Register value, - Register scratch, ZoneLabelRef done, Int32ToNumber* node) { - MaglevAssembler::ScratchRegisterScope temps(masm); - // We can include {scratch} back to the temporary set, since we jump - // over its use to the label {done}. - temps.Include(scratch); - DoubleRegister double_value = temps.AcquireDouble(); - __ Int32ToDouble(double_value, value); - __ AllocateHeapNumber(node->register_snapshot(), object, double_value); - __ b(*done); - }, - object, value, scratch, done, this); - __ Move(object, scratch); - __ bind(*done); -} - -void Uint32ToNumber::SetValueLocationConstraints() { - UseRegister(input()); - DefineAsRegister(this); -} -void Uint32ToNumber::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - MAGLEV_NODE_NOT_IMPLEMENTED(Uint32ToNumber); -} - void Int32AddWithOverflow::SetValueLocationConstraints() { UseRegister(left_input()); UseRegister(right_input()); diff --git a/src/maglev/arm64/maglev-ir-arm64.cc b/src/maglev/arm64/maglev-ir-arm64.cc index d9d05e55fd43..0fe7940cffa6 100644 --- a/src/maglev/arm64/maglev-ir-arm64.cc +++ b/src/maglev/arm64/maglev-ir-arm64.cc @@ -213,61 +213,6 @@ void CheckNumber::GenerateCode(MaglevAssembler* masm, int CheckedObjectToIndex::MaxCallStackArgs() const { return 0; } -void Int32ToNumber::SetValueLocationConstraints() { - UseRegister(input()); - DefineAsRegister(this); -} -void Int32ToNumber::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - ZoneLabelRef done(masm); - Register object = ToRegister(result()); - Register value = ToRegister(input()); - MaglevAssembler::ScratchRegisterScope temps(masm); - Register scratch = temps.Acquire(); - __ Adds(scratch.W(), value.W(), value.W()); - __ JumpToDeferredIf( - vs, - [](MaglevAssembler* masm, Register object, Register value, - Register scratch, ZoneLabelRef done, Int32ToNumber* node) { - MaglevAssembler::ScratchRegisterScope temps(masm); - // We can include {scratch} back to the temporary set, since we jump - // over its use to the label {done}. - temps.Include(scratch); - DoubleRegister double_value = temps.AcquireDouble(); - __ Scvtf(double_value, value.W()); - __ AllocateHeapNumber(node->register_snapshot(), object, double_value); - __ B(*done); - }, - object, value, scratch, done, this); - __ Mov(object, scratch); - __ Bind(*done); -} - -void Uint32ToNumber::SetValueLocationConstraints() { - UseRegister(input()); - DefineAsRegister(this); -} -void Uint32ToNumber::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - ZoneLabelRef done(masm); - Register value = ToRegister(input()); - Register object = ToRegister(result()); - __ Cmp(value.W(), Immediate(Smi::kMaxValue)); - __ JumpToDeferredIf( - hi, - [](MaglevAssembler* masm, Register object, Register value, - ZoneLabelRef done, Uint32ToNumber* node) { - MaglevAssembler::ScratchRegisterScope temps(masm); - DoubleRegister double_value = temps.AcquireDouble(); - __ Ucvtf(double_value, value.W()); - __ AllocateHeapNumber(node->register_snapshot(), object, double_value); - __ B(*done); - }, - object, value, done, this); - __ Add(object, value, value); - __ Bind(*done); -} - void Int32AddWithOverflow::SetValueLocationConstraints() { UseRegister(left_input()); UseRegister(right_input()); diff --git a/src/maglev/maglev-ir.cc b/src/maglev/maglev-ir.cc index 3226c0ea8fcb..d4cee704fbc3 100644 --- a/src/maglev/maglev-ir.cc +++ b/src/maglev/maglev-ir.cc @@ -3374,6 +3374,72 @@ void GetKeyedGeneric::GenerateCode(MaglevAssembler* masm, masm->DefineExceptionHandlerAndLazyDeoptPoint(this); } +void Int32ToNumber::SetValueLocationConstraints() { + UseRegister(input()); + DefineAsRegister(this); +} +void Int32ToNumber::GenerateCode(MaglevAssembler* masm, + const ProcessingState& state) { + Register object = ToRegister(result()); + Register value = ToRegister(input()); + ZoneLabelRef done(masm); + MaglevAssembler::ScratchRegisterScope temps(masm); + bool input_output_alias = (object == value); + Register res = object; + if (input_output_alias) { + res = temps.GetDefaultScratchRegister(); + } + __ SmiTagInt32AndJumpIfFail( + res, value, + __ MakeDeferredCode( + [](MaglevAssembler* masm, Register object, Register value, + ZoneLabelRef done, Int32ToNumber* node) { + MaglevAssembler::ScratchRegisterScope temps(masm); + DoubleRegister double_value = + temps.GetDefaultScratchDoubleRegister(); + __ Int32ToDouble(double_value, value); + __ AllocateHeapNumber(node->register_snapshot(), object, + double_value); + __ Jump(*done); + }, + object, value, done, this)); + if (input_output_alias) { + __ Move(object, res); + } + __ bind(*done); +} + +void Uint32ToNumber::SetValueLocationConstraints() { + UseRegister(input()); +#ifdef V8_TARGET_ARCH_X64 + // We emit slightly more efficient code if result is the same as input. + DefineSameAsFirst(this); +#else + DefineAsRegister(this); +#endif +} +void Uint32ToNumber::GenerateCode(MaglevAssembler* masm, + const ProcessingState& state) { + ZoneLabelRef done(masm); + Register value = ToRegister(input()); + Register object = ToRegister(result()); + __ SmiTagUint32AndJumpIfFail( + object, value, + __ MakeDeferredCode( + [](MaglevAssembler* masm, Register object, Register value, + ZoneLabelRef done, Uint32ToNumber* node) { + MaglevAssembler::ScratchRegisterScope temps(masm); + DoubleRegister double_value = + temps.GetDefaultScratchDoubleRegister(); + __ Uint32ToDouble(double_value, value); + __ AllocateHeapNumber(node->register_snapshot(), object, + double_value); + __ Jump(*done); + }, + object, value, done, this)); + __ bind(*done); +} + void Float64ToTagged::SetValueLocationConstraints() { UseRegister(input()); DefineAsRegister(this); diff --git a/src/maglev/x64/maglev-ir-x64.cc b/src/maglev/x64/maglev-ir-x64.cc index 4e75a0162d91..e51a9e0b74e2 100644 --- a/src/maglev/x64/maglev-ir-x64.cc +++ b/src/maglev/x64/maglev-ir-x64.cc @@ -1019,56 +1019,6 @@ void Float64Ieee754Unary::GenerateCode(MaglevAssembler* masm, __ CallCFunction(ieee_function_, 1); } -void Int32ToNumber::SetValueLocationConstraints() { - UseRegister(input()); - DefineAsRegister(this); -} -void Int32ToNumber::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - ZoneLabelRef done(masm); - Register value = ToRegister(input()); - Register object = ToRegister(result()); - __ movl(kScratchRegister, value); - __ addl(kScratchRegister, kScratchRegister); - __ JumpToDeferredIf( - overflow, - [](MaglevAssembler* masm, Register object, Register value, - ZoneLabelRef done, Int32ToNumber* node) { - DoubleRegister double_value = kScratchDoubleReg; - __ Cvtlsi2sd(double_value, value); - __ AllocateHeapNumber(node->register_snapshot(), object, double_value); - __ jmp(*done); - }, - object, value, done, this); - __ Move(object, kScratchRegister); - __ bind(*done); -} - -void Uint32ToNumber::SetValueLocationConstraints() { - UseRegister(input()); - DefineSameAsFirst(this); -} -void Uint32ToNumber::GenerateCode(MaglevAssembler* masm, - const ProcessingState& state) { - ZoneLabelRef done(masm); - Register value = ToRegister(input()); - Register object = ToRegister(result()); - __ cmpl(value, Immediate(Smi::kMaxValue)); - __ JumpToDeferredIf( - above, - [](MaglevAssembler* masm, Register object, Register value, - ZoneLabelRef done, Uint32ToNumber* node) { - DoubleRegister double_value = kScratchDoubleReg; - __ Cvtlui2sd(double_value, value); - __ AllocateHeapNumber(node->register_snapshot(), object, double_value); - __ jmp(*done); - }, - object, value, done, this); - __ addl(value, value); - DCHECK_EQ(object, value); - __ bind(*done); -} - void HoleyFloat64ToMaybeNanFloat64::SetValueLocationConstraints() { UseRegister(input()); DefineSameAsFirst(this);