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); |
} |