Skip to content

Commit

Permalink
[maglev] Make (U)Int32ToNumber arch independent
Browse files Browse the repository at this point in the history
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 <leszeks@chromium.org>
Auto-Submit: Victor Gomes <victorgomes@chromium.org>
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/main@{#88510}
  • Loading branch information
victorgomes authored and V8 LUCI CQ committed Jun 27, 2023
1 parent c1ab7d9 commit f0ee648
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 144 deletions.
39 changes: 0 additions & 39 deletions src/maglev/arm/maglev-ir-arm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
55 changes: 0 additions & 55 deletions src/maglev/arm64/maglev-ir-arm64.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
66 changes: 66 additions & 0 deletions src/maglev/maglev-ir.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
50 changes: 0 additions & 50 deletions src/maglev/x64/maglev-ir-x64.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit f0ee648

Please sign in to comment.