Reviewers: jarin,
Message:
PTAL
Description:
LoadUint32() doesn't need a scratch register.
Please review this at https://codereview.chromium.org/293363005/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+29, -54 lines):
M src/ia32/lithium-codegen-ia32.h
M src/ia32/lithium-codegen-ia32.cc
M src/ia32/lithium-ia32.h
M src/ia32/lithium-ia32.cc
M src/ia32/macro-assembler-ia32.h
M src/ia32/macro-assembler-ia32.cc
M src/x64/lithium-codegen-x64.cc
M src/x64/lithium-x64.h
M src/x64/lithium-x64.cc
M src/x64/macro-assembler-x64.h
M src/x64/macro-assembler-x64.cc
Index: src/ia32/lithium-codegen-ia32.cc
diff --git a/src/ia32/lithium-codegen-ia32.cc
b/src/ia32/lithium-codegen-ia32.cc
index
1d97d8a91f255b4ca5c085a647522e2eef99a31e..114cf749f7cf5aa76e36ee2a3e3108d7e8604b5b
100644
--- a/src/ia32/lithium-codegen-ia32.cc
+++ b/src/ia32/lithium-codegen-ia32.cc
@@ -4447,10 +4447,7 @@ void
LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) {
void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) {
LOperand* input = instr->value();
LOperand* output = instr->result();
- LOperand* temp = instr->temp();
- __ LoadUint32(ToDoubleRegister(output),
- ToRegister(input),
- ToDoubleRegister(temp));
+ __ LoadUint32(ToDoubleRegister(output), ToRegister(input));
}
@@ -4461,8 +4458,8 @@ void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
LNumberTagI* instr)
: LDeferredCode(codegen), instr_(instr) { }
virtual void Generate() V8_OVERRIDE {
- codegen()->DoDeferredNumberTagIU(instr_, instr_->value(),
instr_->temp(),
- NULL, SIGNED_INT32);
+ codegen()->DoDeferredNumberTagIU(
+ instr_, instr_->value(), instr_->temp(), SIGNED_INT32);
}
virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
private:
@@ -4487,8 +4484,8 @@ void LCodeGen::DoNumberTagU(LNumberTagU* instr) {
DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr)
: LDeferredCode(codegen), instr_(instr) { }
virtual void Generate() V8_OVERRIDE {
- codegen()->DoDeferredNumberTagIU(instr_, instr_->value(),
instr_->temp1(),
- instr_->temp2(), UNSIGNED_INT32);
+ codegen()->DoDeferredNumberTagIU(
+ instr_, instr_->value(), instr_->temp(), UNSIGNED_INT32);
}
virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
private:
@@ -4510,12 +4507,11 @@ void LCodeGen::DoNumberTagU(LNumberTagU* instr) {
void LCodeGen::DoDeferredNumberTagIU(LInstruction* instr,
LOperand* value,
- LOperand* temp1,
- LOperand* temp2,
+ LOperand* temp,
IntegerSignedness signedness) {
Label done, slow;
Register reg = ToRegister(value);
- Register tmp = ToRegister(temp1);
+ Register tmp = ToRegister(temp);
XMMRegister xmm_scratch = double_scratch0();
if (signedness == SIGNED_INT32) {
@@ -4526,7 +4522,7 @@ void LCodeGen::DoDeferredNumberTagIU(LInstruction*
instr,
__ xor_(reg, 0x80000000);
__ Cvtsi2sd(xmm_scratch, Operand(reg));
} else {
- __ LoadUint32(xmm_scratch, reg, ToDoubleRegister(temp2));
+ __ LoadUint32(xmm_scratch, reg);
}
if (FLAG_inline_new) {
Index: src/ia32/lithium-codegen-ia32.h
diff --git a/src/ia32/lithium-codegen-ia32.h
b/src/ia32/lithium-codegen-ia32.h
index
d5a192ebba5c686d12638eab6bc02590f418cbd7..18dfbc1b3ef2b332e5c70bf961d7e557b211a30b
100644
--- a/src/ia32/lithium-codegen-ia32.h
+++ b/src/ia32/lithium-codegen-ia32.h
@@ -95,8 +95,7 @@ class LCodeGen: public LCodeGenBase {
enum IntegerSignedness { SIGNED_INT32, UNSIGNED_INT32 };
void DoDeferredNumberTagIU(LInstruction* instr,
LOperand* value,
- LOperand* temp1,
- LOperand* temp2,
+ LOperand* temp,
IntegerSignedness signedness);
void DoDeferredTaggedToI(LTaggedToI* instr, Label* done);
Index: src/ia32/lithium-ia32.cc
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc
index
6c13443b4e2375da6b4e52c658a112d4d9213850..58290759987e45cc3fdff4e7f8a4ca99c04c115e
100644
--- a/src/ia32/lithium-ia32.cc
+++ b/src/ia32/lithium-ia32.cc
@@ -1941,17 +1941,14 @@ LInstruction* LChunkBuilder::DoChange(HChange*
instr) {
} else if (from.IsInteger32()) {
info()->MarkAsDeferredCalling();
if (to.IsTagged()) {
+ LOperand* value = UseRegister(val);
if (!instr->CheckFlag(HValue::kCanOverflow)) {
- LOperand* value = UseRegister(val);
return DefineSameAsFirst(new(zone()) LSmiTag(value));
} else if (val->CheckFlag(HInstruction::kUint32)) {
- LOperand* value = UseRegister(val);
- LOperand* temp1 = TempRegister();
- LOperand* temp2 = FixedTemp(xmm1);
- LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2);
+ LOperand* temp = TempRegister();
+ LNumberTagU* result = new(zone()) LNumberTagU(value, temp);
return AssignPointerMap(DefineSameAsFirst(result));
} else {
- LOperand* value = UseRegister(val);
LOperand* temp = TempRegister();
LNumberTagI* result = new(zone()) LNumberTagI(value, temp);
return AssignPointerMap(DefineSameAsFirst(result));
@@ -1966,9 +1963,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr)
{
} else {
ASSERT(to.IsDouble());
if (val->CheckFlag(HInstruction::kUint32)) {
- LOperand* temp = FixedTemp(xmm1);
- return DefineAsRegister(
- new(zone()) LUint32ToDouble(UseRegister(val), temp));
+ return DefineAsRegister(new(zone())
LUint32ToDouble(UseRegister(val)));
} else {
return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val)));
}
Index: src/ia32/lithium-ia32.h
diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h
index
20b4a29cd85180b2757e2b9552e9e55560a5c177..5a612b75175d81830c695423864baaaf39232f99
100644
--- a/src/ia32/lithium-ia32.h
+++ b/src/ia32/lithium-ia32.h
@@ -1997,15 +1997,13 @@ class LInteger32ToDouble V8_FINAL : public
LTemplateInstruction<1, 1, 0> {
};
-class LUint32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 1> {
+class LUint32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 0> {
public:
- explicit LUint32ToDouble(LOperand* value, LOperand* temp) {
+ explicit LUint32ToDouble(LOperand* value) {
inputs_[0] = value;
- temps_[0] = temp;
}
LOperand* value() { return inputs_[0]; }
- LOperand* temp() { return temps_[0]; }
DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
};
@@ -2025,17 +2023,15 @@ class LNumberTagI V8_FINAL : public
LTemplateInstruction<1, 1, 1> {
};
-class LNumberTagU V8_FINAL : public LTemplateInstruction<1, 1, 2> {
+class LNumberTagU V8_FINAL : public LTemplateInstruction<1, 1, 1> {
public:
- LNumberTagU(LOperand* value, LOperand* temp1, LOperand* temp2) {
+ LNumberTagU(LOperand* value, LOperand* temp) {
inputs_[0] = value;
- temps_[0] = temp1;
- temps_[1] = temp2;
+ temps_[0] = temp;
}
LOperand* value() { return inputs_[0]; }
- LOperand* temp1() { return temps_[0]; }
- LOperand* temp2() { return temps_[1]; }
+ LOperand* temp() { return temps_[0]; }
DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u")
};
Index: src/ia32/macro-assembler-ia32.cc
diff --git a/src/ia32/macro-assembler-ia32.cc
b/src/ia32/macro-assembler-ia32.cc
index
f96da485eb74b56f586940c9490235882129852e..a8a96f0f68b4a95b403a202643c4c44852809b9c
100644
--- a/src/ia32/macro-assembler-ia32.cc
+++ b/src/ia32/macro-assembler-ia32.cc
@@ -375,16 +375,14 @@ void MacroAssembler::TaggedToI(Register result_reg,
void MacroAssembler::LoadUint32(XMMRegister dst,
- Register src,
- XMMRegister scratch) {
+ Register src) {
Label done;
cmp(src, Immediate(0));
ExternalReference uint32_bias =
ExternalReference::address_of_uint32_bias();
- movsd(scratch, Operand::StaticVariable(uint32_bias));
Cvtsi2sd(dst, src);
j(not_sign, &done, Label::kNear);
- addsd(dst, scratch);
+ addsd(dst, Operand::StaticVariable(uint32_bias));
bind(&done);
}
Index: src/ia32/macro-assembler-ia32.h
diff --git a/src/ia32/macro-assembler-ia32.h
b/src/ia32/macro-assembler-ia32.h
index
71e7427d2d46259b10060f1021aada1920ecba44..ea008005844e3060438da69544ee4926026e6316
100644
--- a/src/ia32/macro-assembler-ia32.h
+++ b/src/ia32/macro-assembler-ia32.h
@@ -465,7 +465,7 @@ class MacroAssembler: public Assembler {
j(not_carry, is_smi);
}
- void LoadUint32(XMMRegister dst, Register src, XMMRegister scratch);
+ void LoadUint32(XMMRegister dst, Register src);
// Jump the register contains a smi.
inline void JumpIfSmi(Register value,
Index: src/x64/lithium-codegen-x64.cc
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
index
8a5f09a9b1602a33297c975a1bc51abe1def254b..5be849f9132b53a2c2aa0c09ebe6772c8ecd54be
100644
--- a/src/x64/lithium-codegen-x64.cc
+++ b/src/x64/lithium-codegen-x64.cc
@@ -4531,11 +4531,8 @@ void
LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) {
void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) {
LOperand* input = instr->value();
LOperand* output = instr->result();
- LOperand* temp = instr->temp();
- __ LoadUint32(ToDoubleRegister(output),
- ToRegister(input),
- ToDoubleRegister(temp));
+ __ LoadUint32(ToDoubleRegister(output), ToRegister(input));
}
@@ -4582,8 +4579,7 @@ void LCodeGen::DoDeferredNumberTagU(LNumberTagU*
instr) {
// Load value into temp_xmm which will be preserved across potential
call to
// runtime (MacroAssembler::EnterExitFrameEpilogue preserves only
allocatable
// XMM registers on x64).
- XMMRegister xmm_scratch = double_scratch0();
- __ LoadUint32(temp_xmm, reg, xmm_scratch);
+ __ LoadUint32(temp_xmm, reg);
if (FLAG_inline_new) {
__ AllocateHeapNumber(reg, tmp, &slow);
Index: src/x64/lithium-x64.cc
diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
index
a3bd9f6b191dbd7b46da2062ccbec0e4f231f559..660c580423d538fb7b263430470cfdf583ce14c0
100644
--- a/src/x64/lithium-x64.cc
+++ b/src/x64/lithium-x64.cc
@@ -1904,9 +1904,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr)
{
} else {
ASSERT(to.IsDouble());
if (val->CheckFlag(HInstruction::kUint32)) {
- LOperand* temp = FixedTemp(xmm1);
- return DefineAsRegister(
- new(zone()) LUint32ToDouble(UseRegister(val), temp));
+ return DefineAsRegister(new(zone())
LUint32ToDouble(UseRegister(val));
} else {
LOperand* value = Use(val);
return DefineAsRegister(new(zone()) LInteger32ToDouble(value));
Index: src/x64/lithium-x64.h
diff --git a/src/x64/lithium-x64.h b/src/x64/lithium-x64.h
index
fe7046f1e73a420802c27ea9d8e0c1bf01dd2f20..3f228249f3a2fcc0c2c12a1c3ba5480eb52b14ac
100644
--- a/src/x64/lithium-x64.h
+++ b/src/x64/lithium-x64.h
@@ -1967,15 +1967,13 @@ class LInteger32ToDouble V8_FINAL : public
LTemplateInstruction<1, 1, 0> {
};
-class LUint32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 1> {
+class LUint32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 0> {
public:
- explicit LUint32ToDouble(LOperand* value, LOperand* temp) {
+ explicit LUint32ToDouble(LOperand* value) {
inputs_[0] = value;
- temps_[0] = temp;
}
LOperand* value() { return inputs_[0]; }
- LOperand* temp() { return temps_[0]; }
DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
};
Index: src/x64/macro-assembler-x64.cc
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
index
48c080dcdc61aa72424a2ba58fc683564700c6e2..8bd08d370bee418ed2083250918f0ebbfaea84b8
100644
--- a/src/x64/macro-assembler-x64.cc
+++ b/src/x64/macro-assembler-x64.cc
@@ -3323,8 +3323,7 @@ void MacroAssembler::ClampDoubleToUint8(XMMRegister
input_reg,
void MacroAssembler::LoadUint32(XMMRegister dst,
- Register src,
- XMMRegister scratch) {
+ Register src) {
if (FLAG_debug_code) {
cmpq(src, Immediate(0xffffffff));
Assert(below_equal, kInputGPRIsExpectedToHaveUpper32Cleared);
Index: src/x64/macro-assembler-x64.h
diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h
index
b110f3a1f1dacec3d6960715c48f1324ed9a9ff5..e6dfdb01d45a8fe2bff8adcbf29a01d87e6075cf
100644
--- a/src/x64/macro-assembler-x64.h
+++ b/src/x64/macro-assembler-x64.h
@@ -1004,7 +1004,7 @@ class MacroAssembler: public Assembler {
MinusZeroMode minus_zero_mode, Label* lost_precision,
Label::Distance dst = Label::kFar);
- void LoadUint32(XMMRegister dst, Register src, XMMRegister scratch);
+ void LoadUint32(XMMRegister dst, Register src);
void LoadInstanceDescriptors(Register map, Register descriptors);
void EnumLength(Register dst, Register map);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.