Chromium Code Reviews| Index: src/ia32/codegen-ia32.cc |
| =================================================================== |
| --- src/ia32/codegen-ia32.cc (revision 4033) |
| +++ src/ia32/codegen-ia32.cc (working copy) |
| @@ -6057,7 +6057,38 @@ |
| frame_->Push(&result); |
| } |
| +void CodeGenerator::GenerateNumberIsFinite(ZoneList<Expression*>* args) { |
| + ASSERT_EQ(args->length(), 1); |
| + Load(args->at(0)); |
| + Result num = frame_->Pop(); |
| + num.ToRegister(); |
| + Result result = allocator_->Allocate(); |
| + Label done; |
| + __ mov(result.reg(), Factory::true_value()); |
| + __ test(num.reg(), Immediate(kSmiTagMask)); |
| + ASSERT(kSmiTag == 0); |
| + __ j(zero, &done); |
| + |
| + // The number is finite if it is not a NaN or Infinite. Both values have |
| + // exponent 11111111111b. |
| + __ mov(num.reg(), FieldOperand(num.reg(), HeapNumber::kExponentOffset)); |
| + __ add(num.reg(), Operand(num.reg())); // Move exponent to the high bits. |
| + __ cmp(num.reg(), HeapNumber::kExponentMask << 1); |
| + |
| + if (CpuFeatures::IsSupported(CMOV)) { |
| + CpuFeatures::Scope use_cmov(CMOV); |
|
Søren Thygesen Gjesse
2010/03/08 12:00:48
If it makes sense to use cmov here then please imp
|
| + __ mov(num.reg(), Factory::false_value()); |
| + __ cmov(above_equal, result.reg(), Operand(num.reg())); |
| + } else { |
| + __ j(below, &done); |
| + __ mov(result.reg(), Factory::false_value()); |
| + } |
| + |
| + __ bind(&done); |
| + frame_->Push(&result); |
| +} |
| + |
| void CodeGenerator::VisitCallRuntime(CallRuntime* node) { |
| if (CheckForInlineRuntimeCall(node)) { |
| return; |