Index: src/ia32/lithium-ia32.cc |
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc |
index cf10964dae168ade2c678b07982a86862d617cfd..a7bb2d95fbdf539fdb40b949145842dd50f9b9c9 100644 |
--- a/src/ia32/lithium-ia32.cc |
+++ b/src/ia32/lithium-ia32.cc |
@@ -320,29 +320,6 @@ void LCallConstantFunction::PrintDataTo(StringStream* stream) { |
} |
-void LUnaryMathOperation::PrintDataTo(StringStream* stream) { |
- stream->Add("/%s ", hydrogen()->OpName()); |
- value()->PrintTo(stream); |
-} |
- |
- |
-void LMathExp::PrintDataTo(StringStream* stream) { |
- value()->PrintTo(stream); |
-} |
- |
- |
-void LMathPowHalf::PrintDataTo(StringStream* stream) { |
- stream->Add("/pow_half "); |
- value()->PrintTo(stream); |
-} |
- |
- |
-void LMathRound::PrintDataTo(StringStream* stream) { |
- stream->Add("/round "); |
- value()->PrintTo(stream); |
-} |
- |
- |
void LLoadContextSlot::PrintDataTo(StringStream* stream) { |
context()->PrintTo(stream); |
stream->Add("[%d]", slot_index()); |
@@ -1208,62 +1185,105 @@ LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { |
LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { |
- BuiltinFunctionId op = instr->op(); |
- if (op == kMathLog) { |
- ASSERT(instr->representation().IsDouble()); |
- ASSERT(instr->value()->representation().IsDouble()); |
- LOperand* context = UseAny(instr->context()); // Not actually used. |
- LOperand* input = UseRegisterAtStart(instr->value()); |
- LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(context, |
- input); |
- return DefineSameAsFirst(result); |
- } else if (op == kMathExp) { |
- ASSERT(instr->representation().IsDouble()); |
- ASSERT(instr->value()->representation().IsDouble()); |
- LOperand* value = UseTempRegister(instr->value()); |
- LOperand* temp1 = TempRegister(); |
- LOperand* temp2 = TempRegister(); |
- LMathExp* result = new(zone()) LMathExp(value, temp1, temp2); |
- return DefineAsRegister(result); |
- } else if (op == kMathSin || op == kMathCos || op == kMathTan) { |
- LOperand* context = UseFixed(instr->context(), esi); |
- LOperand* input = UseFixedDouble(instr->value(), xmm1); |
- LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(context, |
- input); |
- return MarkAsCall(DefineFixedDouble(result, xmm1), instr); |
- } else { |
- LOperand* context = UseAny(instr->context()); // Deferred use by MathAbs. |
- LOperand* input = NULL; |
- if (op == kMathPowHalf) { |
- input = UseRegisterAtStart(instr->value()); |
- LOperand* temp = TempRegister(); |
- LMathPowHalf* result = new(zone()) LMathPowHalf(context, input, temp); |
- return DefineSameAsFirst(result); |
- } else if (op == kMathRound) { |
- input = UseRegister(instr->value()); |
- LOperand* temp = FixedTemp(xmm4); |
- LMathRound* result = new(zone()) LMathRound(context, input, temp); |
- return AssignEnvironment(DefineAsRegister(result)); |
- } else { |
- input = UseRegisterAtStart(instr->value()); |
- } |
- LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(context, |
- input); |
- switch (op) { |
- case kMathAbs: |
- return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); |
- case kMathFloor: |
- return AssignEnvironment(DefineAsRegister(result)); |
- case kMathSqrt: |
- return DefineSameAsFirst(result); |
- default: |
- UNREACHABLE(); |
- return NULL; |
- } |
+ switch (instr->op()) { |
+ case kMathFloor: return DoMathFloor(instr); |
+ case kMathRound: return DoMathRound(instr); |
+ case kMathAbs: return DoMathAbs(instr); |
+ case kMathLog: return DoMathLog(instr); |
+ case kMathSin: return DoMathSin(instr); |
+ case kMathCos: return DoMathCos(instr); |
+ case kMathTan: return DoMathTan(instr); |
+ case kMathExp: return DoMathExp(instr); |
+ case kMathSqrt: return DoMathSqrt(instr); |
+ case kMathPowHalf: return DoMathPowHalf(instr); |
+ default: |
+ UNREACHABLE(); |
+ return NULL; |
} |
} |
+LInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { |
+ LOperand* input = UseRegisterAtStart(instr->value()); |
+ LMathFloor* result = new(zone()) LMathFloor(input); |
+ return AssignEnvironment(DefineAsRegister(result)); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { |
+ LOperand* context = UseAny(instr->context()); |
+ LOperand* input = UseRegister(instr->value()); |
+ LOperand* temp = FixedTemp(xmm4); |
+ LMathRound* result = new(zone()) LMathRound(context, input, temp); |
+ return AssignEnvironment(DefineAsRegister(result)); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { |
+ LOperand* context = UseAny(instr->context()); // Deferred use. |
+ LOperand* input = UseRegisterAtStart(instr->value()); |
+ LMathAbs* result = new(zone()) LMathAbs(context, input); |
+ return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { |
+ ASSERT(instr->representation().IsDouble()); |
+ ASSERT(instr->value()->representation().IsDouble()); |
+ LOperand* input = UseRegisterAtStart(instr->value()); |
+ LMathLog* result = new(zone()) LMathLog(input); |
+ return DefineSameAsFirst(result); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathSin(HUnaryMathOperation* instr) { |
+ LOperand* input = UseFixedDouble(instr->value(), xmm1); |
+ LMathSin* result = new(zone()) LMathSin(input); |
+ return MarkAsCall(DefineFixedDouble(result, xmm1), instr); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathCos(HUnaryMathOperation* instr) { |
+ LOperand* input = UseFixedDouble(instr->value(), xmm1); |
+ LMathCos* result = new(zone()) LMathCos(input); |
+ return MarkAsCall(DefineFixedDouble(result, xmm1), instr); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathTan(HUnaryMathOperation* instr) { |
+ LOperand* input = UseFixedDouble(instr->value(), xmm1); |
+ LMathTan* result = new(zone()) LMathTan(input); |
+ return MarkAsCall(DefineFixedDouble(result, xmm1), instr); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { |
+ ASSERT(instr->representation().IsDouble()); |
+ ASSERT(instr->value()->representation().IsDouble()); |
+ LOperand* value = UseTempRegister(instr->value()); |
+ LOperand* temp1 = TempRegister(); |
+ LOperand* temp2 = TempRegister(); |
+ LMathExp* result = new(zone()) LMathExp(value, temp1, temp2); |
+ return DefineAsRegister(result); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { |
+ LOperand* input = UseRegisterAtStart(instr->value()); |
+ LMathSqrt* result = new(zone()) LMathSqrt(input); |
+ return DefineSameAsFirst(result); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { |
+ LOperand* context = UseAny(instr->context()); |
+ LOperand* input = UseRegisterAtStart(instr->value()); |
+ LOperand* temp = TempRegister(); |
+ LMathPowHalf* result = new(zone()) LMathPowHalf(context, input, temp); |
+ return DefineSameAsFirst(result); |
+} |
+ |
+ |
LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { |
ASSERT(instr->key()->representation().IsTagged()); |
LOperand* context = UseFixed(instr->context(), esi); |