| Index: src/ia32/lithium-ia32.cc
|
| diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc
|
| index b6e75414d98044916df7f2e86de46ba3a832fc29..8d660858508411408bd1ffc9aa31f7a86a22873b 100644
|
| --- a/src/ia32/lithium-ia32.cc
|
| +++ b/src/ia32/lithium-ia32.cc
|
| @@ -1886,13 +1886,6 @@ LInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation(
|
| }
|
|
|
|
|
| -LInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
|
| - // The control instruction marking the end of a block that completed
|
| - // abruptly (e.g., threw an exception). There is nothing specific to do.
|
| - return NULL;
|
| -}
|
| -
|
| -
|
| LInstruction* LChunkBuilder::DoThrow(HThrow* instr) {
|
| LOperand* context = UseFixed(instr->context(), esi);
|
| LOperand* value = UseFixed(instr->value(), eax);
|
| @@ -1945,26 +1938,17 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
|
| } else {
|
| ASSERT(to.IsInteger32());
|
| - if (instr->value()->type().IsSmi()) {
|
| - LOperand* value = UseRegister(instr->value());
|
| + HValue* val = instr->value();
|
| + if (val->type().IsSmi() || val->representation().IsSmi()) {
|
| + LOperand* value = UseRegister(val);
|
| return DefineSameAsFirst(new(zone()) LSmiUntag(value, false));
|
| } else {
|
| bool truncating = instr->CanTruncateToInt32();
|
| - if (CpuFeatures::IsSafeForSnapshot(SSE2)) {
|
| - LOperand* value = UseRegister(instr->value());
|
| - LOperand* xmm_temp =
|
| - (truncating && CpuFeatures::IsSupported(SSE3))
|
| - ? NULL
|
| - : FixedTemp(xmm1);
|
| - LTaggedToI* res = new(zone()) LTaggedToI(value, xmm_temp);
|
| - return AssignEnvironment(DefineSameAsFirst(res));
|
| - } else {
|
| - LOperand* value = UseFixed(instr->value(), ecx);
|
| - LTaggedToINoSSE2* res =
|
| - new(zone()) LTaggedToINoSSE2(value, TempRegister(),
|
| - TempRegister(), TempRegister());
|
| - return AssignEnvironment(DefineFixed(res, ecx));
|
| - }
|
| + LOperand* xmm_temp =
|
| + (CpuFeatures::IsSafeForSnapshot(SSE2) && !truncating)
|
| + ? FixedTemp(xmm1) : NULL;
|
| + LTaggedToI* res = new(zone()) LTaggedToI(UseRegister(val), xmm_temp);
|
| + return AssignEnvironment(DefineSameAsFirst(res));
|
| }
|
| }
|
| } else if (from.IsDouble()) {
|
| @@ -1984,7 +1968,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| } else {
|
| ASSERT(to.IsInteger32());
|
| bool truncating = instr->CanTruncateToInt32();
|
| - bool needs_temp = truncating && !CpuFeatures::IsSupported(SSE3);
|
| + bool needs_temp = CpuFeatures::IsSafeForSnapshot(SSE2) && !truncating;
|
| LOperand* value = needs_temp ?
|
| UseTempRegister(instr->value()) : UseRegister(instr->value());
|
| LOperand* temp = needs_temp ? TempRegister() : NULL;
|
| @@ -2059,14 +2043,14 @@ LInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
|
| }
|
|
|
|
|
| -LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
|
| - // If the target is in new space, we'll emit a global cell compare and so
|
| - // want the value in a register. If the target gets promoted before we
|
| +LInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
|
| + // If the object is in new space, we'll emit a global cell compare and so
|
| + // want the value in a register. If the object gets promoted before we
|
| // emit code, we will still get the register but will do an immediate
|
| // compare instead of the cell compare. This is safe.
|
| - LOperand* value = instr->target_in_new_space()
|
| + LOperand* value = instr->object_in_new_space()
|
| ? UseRegisterAtStart(instr->value()) : UseAtStart(instr->value());
|
| - return AssignEnvironment(new(zone()) LCheckFunction(value));
|
| + return AssignEnvironment(new(zone()) LCheckValue(value));
|
| }
|
|
|
|
|
|
|