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 6d360e0799225846209cbfdcb5a3efe89dc51209..8e783d91fa53fdfc7726fd91c62cbaea40069c0c 100644 |
| --- a/src/arm/lithium-codegen-arm.cc |
| +++ b/src/arm/lithium-codegen-arm.cc |
| @@ -1756,8 +1756,38 @@ Condition LHasInstanceType::BranchCondition() { |
| } |
| +static InstanceType TestType(HHasInstanceType* instr) { |
| + InstanceType from = instr->from(); |
| + InstanceType to = instr->to(); |
| + if (from == FIRST_TYPE) return to; |
| + ASSERT(from == to || to == LAST_TYPE); |
| + return from; |
| +} |
| + |
| + |
| +static Condition BranchCondition(HHasInstanceType* instr) { |
| + InstanceType from = instr->from(); |
| + InstanceType to = instr->to(); |
| + if (from == to) return eq; |
| + if (to == LAST_TYPE) return hs; |
| + if (from == FIRST_TYPE) return ls; |
| + UNREACHABLE(); |
| + return eq; |
| +} |
| + |
| + |
| void LCodeGen::DoHasInstanceType(LHasInstanceType* instr) { |
| - Abort("DoHasInstanceType unimplemented."); |
| + Register input = ToRegister(instr->input()); |
| + Register result = ToRegister(instr->result()); |
| + |
| + ASSERT(instr->hydrogen()->value()->representation().IsTagged()); |
| + __ tst(input, Operand(kSmiTagMask)); |
| + Label done, is_false; |
|
Søren Thygesen Gjesse
2011/01/19 12:55:00
done currently not used.
|
| + __ b(eq, &is_false); |
|
Søren Thygesen Gjesse
2011/01/19 12:55:00
There is a JumpIfSmi in ARM macro assembler.
But,
|
| + __ CompareObjectType(input, result, result, TestType(instr->hydrogen())); |
| + Condition cond = BranchCondition(instr->hydrogen()); |
| + __ LoadRoot(result, Heap::kTrueValueRootIndex, cond); |
| + __ LoadRoot(result, Heap::kFalseValueRootIndex, NegateCondition(cond)); |
| } |