Index: src/ia32/lithium-ia32.cc |
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc |
index a8905b45cb93620a1a09390b4f0c191f0cc0e464..cd4a957d8522c5545b861e545f6811418d96acee 100644 |
--- a/src/ia32/lithium-ia32.cc |
+++ b/src/ia32/lithium-ia32.cc |
@@ -82,6 +82,17 @@ bool LInstruction::HasDoubleRegisterInput() { |
} |
+bool LInstruction::IsDoubleInput(X87Register reg, LCodeGen* cgen) { |
+ for (int i = 0; i < InputCount(); i++) { |
+ LOperand* op = InputAt(i); |
+ if (op != NULL && op->IsDoubleRegister()) { |
+ if (cgen->ToX87Register(op).is(reg)) return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+ |
void LInstruction::PrintTo(StringStream* stream) { |
stream->Add("%s ", this->Mnemonic()); |
@@ -494,12 +505,6 @@ LUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) { |
} |
-LUnallocated* LChunkBuilder::ToUnallocated(X87TopOfStackRegister reg) { |
- return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, |
- X87TopOfStackRegister::ToAllocationIndex(reg)); |
-} |
- |
- |
LOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { |
return Use(value, ToUnallocated(fixed_register)); |
} |
@@ -510,11 +515,6 @@ LOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) { |
} |
-LOperand* LChunkBuilder::UseX87TopOfStack(HValue* value) { |
- return Use(value, ToUnallocated(x87tos)); |
-} |
- |
- |
LOperand* LChunkBuilder::UseRegister(HValue* value) { |
return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); |
} |
@@ -642,13 +642,6 @@ LInstruction* LChunkBuilder::DefineFixedDouble( |
} |
-template<int I, int T> |
-LInstruction* LChunkBuilder::DefineX87TOS( |
- LTemplateInstruction<1, I, T>* instr) { |
- return Define(instr, ToUnallocated(x87tos)); |
-} |
- |
- |
LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { |
HEnvironment* hydrogen_env = current_block_->last_environment(); |
int argument_index_accumulator = 0; |
@@ -1577,17 +1570,7 @@ LInstruction* LChunkBuilder::DoMul(HMul* instr) { |
} |
return DefineSameAsFirst(mul); |
} else if (instr->representation().IsDouble()) { |
- if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
- return DoArithmeticD(Token::MUL, instr); |
- } |
- ASSERT(instr->right()->IsConstant() && |
- static_cast<HConstant*>(instr->right())->DoubleValue() == -1); |
- // TODO(olivf) This is currently just a hack to support the UnaryOp Minus |
- // Stub. This will go away once we can use more than one X87 register, |
- // thus fully support binary instructions without SSE2. |
- LOperand* left = UseX87TopOfStack(instr->left()); |
- LNegateNoSSE2D* result = new(zone()) LNegateNoSSE2D(left); |
- return DefineX87TOS(result); |
+ return DoArithmeticD(Token::MUL, instr); |
} else { |
ASSERT(instr->representation().IsSmiOrTagged()); |
return DoArithmeticT(Token::MUL, instr); |
@@ -1937,11 +1920,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
? TempRegister() |
: NULL; |
LNumberUntagD* res = new(zone()) LNumberUntagD(value, temp); |
- if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
- return AssignEnvironment(DefineAsRegister(res)); |
- } else { |
- return AssignEnvironment(DefineX87TOS(res)); |
- } |
+ return AssignEnvironment(DefineAsRegister(res)); |
} else if (to.IsSmi()) { |
HValue* val = instr->value(); |
LOperand* value = UseRegister(val); |
@@ -1976,9 +1955,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
} else if (from.IsDouble()) { |
if (to.IsTagged()) { |
info()->MarkAsDeferredCalling(); |
- LOperand* value = CpuFeatures::IsSupported(SSE2) |
- ? UseRegisterAtStart(instr->value()) |
- : UseAtStart(instr->value()); |
+ LOperand* value = UseRegisterAtStart(instr->value()); |
LOperand* temp = FLAG_inline_new ? TempRegister() : NULL; |
// Make sure that temp and result_temp are different registers. |
@@ -2140,12 +2117,8 @@ LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { |
} else if (r.IsDouble()) { |
double value = instr->DoubleValue(); |
bool value_is_zero = BitCast<uint64_t, double>(value) == 0; |
- if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
- LOperand* temp = value_is_zero ? NULL : TempRegister(); |
- return DefineAsRegister(new(zone()) LConstantD(temp)); |
- } else { |
- return DefineX87TOS(new(zone()) LConstantD(NULL)); |
- } |
+ LOperand* temp = value_is_zero ? NULL : TempRegister(); |
+ return DefineAsRegister(new(zone()) LConstantD(temp)); |
} else if (r.IsTagged()) { |
return DefineAsRegister(new(zone()) LConstantT); |
} else { |
@@ -2337,11 +2310,7 @@ LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { |
if (instr->value()->representation().IsDouble()) { |
LOperand* object = UseRegisterAtStart(instr->elements()); |
LOperand* val = NULL; |
- if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
- val = UseRegisterAtStart(instr->value()); |
- } else if (!instr->IsConstantHoleStore()) { |
- val = UseX87TopOfStack(instr->value()); |
- } |
+ val = UseRegisterAtStart(instr->value()); |
LOperand* key = UseRegisterOrConstantAtStart(instr->key()); |
return new(zone()) LStoreKeyed(object, key, val); |
} else { |
@@ -2471,11 +2440,7 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { |
val = UseTempRegister(instr->value()); |
} else if (FLAG_track_double_fields && |
instr->field_representation().IsDouble()) { |
- if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
- val = UseRegisterAtStart(instr->value()); |
- } else { |
- val = UseX87TopOfStack(instr->value()); |
- } |
+ val = UseRegisterAtStart(instr->value()); |
} else { |
val = UseRegister(instr->value()); |
} |