Chromium Code Reviews| Index: runtime/vm/flow_graph_optimizer.cc |
| =================================================================== |
| --- runtime/vm/flow_graph_optimizer.cc (revision 16928) |
| +++ runtime/vm/flow_graph_optimizer.cc (working copy) |
| @@ -1228,22 +1228,35 @@ |
| return true; |
| } |
| - if ((recognized_kind == MethodRecognizer::kDoubleToInteger) && |
| - (class_ids[0] == kDoubleCid)) { |
| - AddCheckClass(call, call->ArgumentAt(0)->value()->Copy()); |
| - ASSERT(call->HasICData()); |
| - const ICData& ic_data = *call->ic_data(); |
| - Definition* d2i_instr = NULL; |
| - if (ic_data.deopt_reason() == kDeoptDoubleToSmi) { |
| - // Do not repeatedly deoptimize because result didn't fit into Smi. |
| - d2i_instr = new DoubleToIntegerInstr(call->ArgumentAt(0)->value(), call); |
| - } else { |
| - // Optimistically assume result fits into Smi. |
| - d2i_instr = new DoubleToSmiInstr(call->ArgumentAt(0)->value(), call); |
| + if (class_ids[0] == kDoubleCid) { |
| + if (recognized_kind == MethodRecognizer::kDoubleToInteger) { |
| + AddCheckClass(call, call->ArgumentAt(0)->value()->Copy()); |
| + ASSERT(call->HasICData()); |
| + const ICData& ic_data = *call->ic_data(); |
| + Definition* d2i_instr = NULL; |
| + if (ic_data.deopt_reason() == kDeoptDoubleToSmi) { |
| + // Do not repeatedly deoptimize because result didn't fit into Smi. |
| + d2i_instr = new DoubleToIntegerInstr(call->ArgumentAt(0)->value(), |
| + call); |
| + } else { |
| + // Optimistically assume result fits into Smi. |
| + d2i_instr = new DoubleToSmiInstr(call->ArgumentAt(0)->value(), call); |
| + } |
| + call->ReplaceWith(d2i_instr, current_iterator()); |
| + RemovePushArguments(call); |
| + return true; |
| } |
| - call->ReplaceWith(d2i_instr, current_iterator()); |
| - RemovePushArguments(call); |
| - return true; |
| + if ((recognized_kind == MethodRecognizer::kDoubleTruncate) || |
| + (recognized_kind == MethodRecognizer::kDoubleRound)) { |
|
Florian Schneider
2013/01/11 09:49:30
You need to check if SSE 4.1 is supported here: CP
srdjan
2013/01/11 19:48:21
Done.
|
| + AddCheckClass(call, call->ArgumentAt(0)->value()->Copy()); |
| + DoubleToDoubleInstr* d2d_instr = |
| + new DoubleToDoubleInstr(call->ArgumentAt(0)->value(), |
| + call, |
| + recognized_kind); |
| + call->ReplaceWith(d2d_instr, current_iterator()); |
| + RemovePushArguments(call); |
| + return true; |
| + } |
| } |
| return false; |
| @@ -4194,6 +4207,12 @@ |
| } |
| +void ConstantPropagator::VisitDoubleToDouble(DoubleToDoubleInstr* instr) { |
| + // TODO(kmillikin): Handle conversion. |
| + SetValue(instr, non_constant_); |
| +} |
| + |
| + |
| void ConstantPropagator::VisitConstant(ConstantInstr* instr) { |
| SetValue(instr, instr->value()); |
| } |