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