Chromium Code Reviews| Index: src/arm/lithium-codegen-arm.cc |
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
| index ea88cb3f84a92652ec2d98dd7f44ede82bd72c5a..ca04d71cfcccab95fde94b40be9fc8c63efda2c0 100644 |
| --- a/src/arm/lithium-codegen-arm.cc |
| +++ b/src/arm/lithium-codegen-arm.cc |
| @@ -1626,17 +1626,58 @@ Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) { |
| void LCodeGen::EmitCmpI(LOperand* left, LOperand* right) { |
| __ cmp(ToRegister(left), ToOperand(right)); |
| - Abort("EmitCmpI untested."); |
| } |
| void LCodeGen::DoCmpID(LCmpID* instr) { |
| - Abort("DoCmpID unimplemented."); |
| + LOperand* left = instr->InputAt(0); |
| + LOperand* right = instr->InputAt(1); |
| + LOperand* result = instr->result(); |
| + Register scratch = scratch0(); |
| + |
| + Label unordered, done; |
| + if (instr->is_double()) { |
| + // Compare left and right as doubles and load the |
| + // resulting flags into the normal status register. |
| + __ vcmp(ToDoubleRegister(left), ToDoubleRegister(right)); |
| + __ vmrs(pc); |
| + // If a NaN is involved, i.e. the result is unordered (V set), |
| + // jump to unordered to return false. |
| + __ b(vs, &unordered); |
| + } else { |
| + EmitCmpI(left, right); |
| + } |
| + |
| + Condition cc = TokenToCondition(instr->op(), instr->is_double()); |
| + __ LoadRoot(ToRegister(result), Heap::kTrueValueRootIndex); |
| + __ b(cc, &done); |
| + |
| + __ bind(&unordered); |
| + __ LoadRoot(ToRegister(result), Heap::kFalseValueRootIndex); |
| + __ bind(&done); |
| } |
| void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) { |
| - Abort("DoCmpIDAndBranch unimplemented."); |
| + LOperand* left = instr->InputAt(0); |
| + LOperand* right = instr->InputAt(1); |
| + int false_block = chunk_->LookupDestination(instr->false_block_id()); |
| + int true_block = chunk_->LookupDestination(instr->true_block_id()); |
| + |
| + if (instr->is_double()) { |
| + // Compare left and right as doubles and load the |
| + // resulting flags into the normal status register. |
| + __ vcmp(ToDoubleRegister(left), ToDoubleRegister(right)); |
| + __ vmrs(pc); |
| + // If a NaN is involved, i.e. the result is unordered (V set), |
|
Søren Thygesen Gjesse
2011/02/04 10:20:53
jump to unordered -> jump to false label.
|
| + // jump to unordered to return false. |
| + __ b(vs, chunk_->GetAssemblyLabel(false_block)); |
| + } else { |
| + EmitCmpI(left, right); |
| + } |
| + |
| + Condition cc = TokenToCondition(instr->op(), instr->is_double()); |
| + EmitBranch(true_block, false_block, cc); |
| } |