| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 9727b842345fd5bc45fbfdf52423e6193b30f11b..7099a9d5b75ed723381a1c327b5c8236a507c46a 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -1733,9 +1733,9 @@ void LCodeGen::DoMulI(LMulI* instr) {
|
| case 9:
|
| __ lea(left, Operand(left, left, times_8, 0));
|
| break;
|
| - case 16:
|
| - __ shl(left, 4);
|
| - break;
|
| + case 16:
|
| + __ shl(left, 4);
|
| + break;
|
| default:
|
| __ imul(left, left, constant);
|
| break;
|
| @@ -2208,8 +2208,6 @@ void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
|
| XMMRegister left = ToDoubleRegister(instr->left());
|
| XMMRegister right = ToDoubleRegister(instr->right());
|
| XMMRegister result = ToDoubleRegister(instr->result());
|
| - // Modulo uses a fixed result register.
|
| - ASSERT(instr->op() == Token::MOD || left.is(result));
|
| switch (instr->op()) {
|
| case Token::ADD:
|
| __ addsd(left, right);
|
| @@ -2236,7 +2234,7 @@ void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
|
| 4);
|
|
|
| // Return value is in st(0) on ia32.
|
| - // Store it into the (fixed) result register.
|
| + // Store it into the result register.
|
| __ sub(Operand(esp), Immediate(kDoubleSize));
|
| __ fstp_d(Operand(esp, 0));
|
| __ movdbl(result, Operand(esp, 0));
|
| @@ -2295,7 +2293,7 @@ void LCodeGen::DoArithmeticT(LArithmeticT* instr) {
|
| ASSERT(ToRegister(instr->right()).is(eax));
|
| ASSERT(ToRegister(instr->result()).is(eax));
|
|
|
| - BinaryOpStub stub(instr->op(), NO_OVERWRITE);
|
| + BinaryOpStub stub(instr->op());
|
| CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
|
| __ nop(); // Signals no inlined code.
|
| }
|
| @@ -5289,13 +5287,11 @@ void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg,
|
| }
|
|
|
| __ bind(&load_smi);
|
| - // Clobbering a temp is faster than re-tagging the
|
| - // input register since we avoid dependencies.
|
| - __ mov(temp_reg, input_reg);
|
| - __ SmiUntag(temp_reg); // Untag smi before converting to float.
|
| - __ push(temp_reg);
|
| + __ SmiUntag(input_reg); // Untag smi before converting to float.
|
| + __ push(input_reg);
|
| __ fild_s(Operand(esp, 0));
|
| - __ add(esp, Immediate(kPointerSize));
|
| + __ pop(input_reg);
|
| + __ SmiTag(input_reg); // Retag smi.
|
| __ bind(&done);
|
| X87CommitWrite(res_reg);
|
| }
|
| @@ -5351,6 +5347,7 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
|
| ASSERT(mode == NUMBER_CANDIDATE_IS_SMI);
|
| }
|
|
|
| + // Smi to XMM conversion
|
| __ bind(&load_smi);
|
| // Smi to XMM conversion. Clobbering a temp is faster than re-tagging the
|
| // input register since we avoid dependencies.
|
| @@ -5417,12 +5414,16 @@ void LCodeGen::DoTaggedToI(LTaggedToI* instr) {
|
| Register input_reg = ToRegister(input);
|
| ASSERT(input_reg.is(ToRegister(instr->result())));
|
|
|
| - DeferredTaggedToI* deferred =
|
| - new(zone()) DeferredTaggedToI(this, instr, x87_stack_);
|
| + if (instr->hydrogen()->value()->representation().IsSmi()) {
|
| + __ SmiUntag(input_reg);
|
| + } else {
|
| + DeferredTaggedToI* deferred =
|
| + new(zone()) DeferredTaggedToI(this, instr, x87_stack_);
|
|
|
| - __ JumpIfNotSmi(input_reg, deferred->entry());
|
| - __ SmiUntag(input_reg);
|
| - __ bind(deferred->exit());
|
| + __ JumpIfNotSmi(input_reg, deferred->entry());
|
| + __ SmiUntag(input_reg);
|
| + __ bind(deferred->exit());
|
| + }
|
| }
|
|
|
|
|
|
|