Commit 5a0d1ba8 authored by olivf@chromium.org's avatar olivf@chromium.org

NumberUntagD is faster when untagging in a temp register

BUG=
R=ulan@chromium.org

Review URL: https://codereview.chromium.org/23684056

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16690 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent f375e051
...@@ -5289,11 +5289,13 @@ void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg, ...@@ -5289,11 +5289,13 @@ void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg,
} }
__ bind(&load_smi); __ bind(&load_smi);
__ SmiUntag(input_reg); // Untag smi before converting to float. // Clobbering a temp is faster than re-tagging the
__ push(input_reg); // input register since we avoid dependencies.
__ mov(temp_reg, input_reg);
__ SmiUntag(temp_reg); // Untag smi before converting to float.
__ push(temp_reg);
__ fild_s(Operand(esp, 0)); __ fild_s(Operand(esp, 0));
__ pop(input_reg); __ add(esp, Immediate(kPointerSize));
__ SmiTag(input_reg); // Retag smi.
__ bind(&done); __ bind(&done);
X87CommitWrite(res_reg); X87CommitWrite(res_reg);
} }
...@@ -5349,11 +5351,12 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, ...@@ -5349,11 +5351,12 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
ASSERT(mode == NUMBER_CANDIDATE_IS_SMI); ASSERT(mode == NUMBER_CANDIDATE_IS_SMI);
} }
// Smi to XMM conversion
__ bind(&load_smi); __ bind(&load_smi);
__ SmiUntag(input_reg); // Untag smi before converting to float. // Smi to XMM conversion. Clobbering a temp is faster than re-tagging the
__ cvtsi2sd(result_reg, Operand(input_reg)); // input register since we avoid dependencies.
__ SmiTag(input_reg); // Retag smi. __ mov(temp_reg, input_reg);
__ SmiUntag(temp_reg); // Untag smi before converting to float.
__ cvtsi2sd(result_reg, Operand(temp_reg));
__ bind(&done); __ bind(&done);
} }
...@@ -5427,14 +5430,14 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) { ...@@ -5427,14 +5430,14 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
LOperand* input = instr->value(); LOperand* input = instr->value();
ASSERT(input->IsRegister()); ASSERT(input->IsRegister());
LOperand* temp = instr->temp(); LOperand* temp = instr->temp();
ASSERT(temp == NULL || temp->IsRegister()); ASSERT(temp->IsRegister());
LOperand* result = instr->result(); LOperand* result = instr->result();
ASSERT(result->IsDoubleRegister()); ASSERT(result->IsDoubleRegister());
Register input_reg = ToRegister(input); Register input_reg = ToRegister(input);
bool deoptimize_on_minus_zero = bool deoptimize_on_minus_zero =
instr->hydrogen()->deoptimize_on_minus_zero(); instr->hydrogen()->deoptimize_on_minus_zero();
Register temp_reg = deoptimize_on_minus_zero ? ToRegister(temp) : no_reg; Register temp_reg = ToRegister(temp);
HValue* value = instr->hydrogen()->value(); HValue* value = instr->hydrogen()->value();
NumberUntagDMode mode = value->representation().IsSmi() NumberUntagDMode mode = value->representation().IsSmi()
......
...@@ -1947,9 +1947,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { ...@@ -1947,9 +1947,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
info()->MarkAsDeferredCalling(); info()->MarkAsDeferredCalling();
LOperand* value = UseRegister(instr->value()); LOperand* value = UseRegister(instr->value());
// Temp register only necessary for minus zero check. // Temp register only necessary for minus zero check.
LOperand* temp = instr->deoptimize_on_minus_zero() LOperand* temp = TempRegister();
? TempRegister()
: NULL;
LNumberUntagD* res = new(zone()) LNumberUntagD(value, temp); LNumberUntagD* res = new(zone()) LNumberUntagD(value, temp);
return AssignEnvironment(DefineAsRegister(res)); return AssignEnvironment(DefineAsRegister(res));
} else if (to.IsSmi()) { } else if (to.IsSmi()) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment