| 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..08f58cb57e61be198f911da122b2328098ff48d4 100644
|
| --- a/src/arm/lithium-codegen-arm.cc
|
| +++ b/src/arm/lithium-codegen-arm.cc
|
| @@ -1756,8 +1756,40 @@ 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());
|
| + Label done;
|
| + __ tst(input, Operand(kSmiTagMask));
|
| + __ LoadRoot(result, Heap::kFalseValueRootIndex, eq);
|
| + __ b(eq, &done);
|
| + __ CompareObjectType(input, result, result, TestType(instr->hydrogen()));
|
| + Condition cond = BranchCondition(instr->hydrogen());
|
| + __ LoadRoot(result, Heap::kTrueValueRootIndex, cond);
|
| + __ LoadRoot(result, Heap::kFalseValueRootIndex, NegateCondition(cond));
|
| + __ bind(&done);
|
| }
|
|
|
|
|
|
|