Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 4b045385a40a9bd5eb809510db8825d21393847d..e1b1e552faa91e45ee30de077ffd1dcd7118f399 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -3867,22 +3867,39 @@ void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) { |
void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) { |
Register input = ToRegister(instr->InputAt(0)); |
Register scratch = scratch0(); |
- InstanceType first = instr->hydrogen()->first(); |
- InstanceType last = instr->hydrogen()->last(); |
__ ldr(scratch, FieldMemOperand(input, HeapObject::kMapOffset)); |
__ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset)); |
- __ cmp(scratch, Operand(first)); |
- // If there is only one type in the interval check for equality. |
- if (first == last) { |
- DeoptimizeIf(ne, instr->environment()); |
+ if (instr->hydrogen()->is_range()) { |
+ InstanceType first = instr->hydrogen()->first(); |
+ InstanceType last = instr->hydrogen()->last(); |
+ |
+ __ cmp(scratch, Operand(first)); |
+ |
+ // If there is only one type in the interval check for equality. |
+ if (first == last) { |
+ DeoptimizeIf(ne, instr->environment()); |
+ } else { |
+ DeoptimizeIf(lo, instr->environment()); |
+ // Omit check for the last type. |
+ if (last != LAST_TYPE) { |
+ __ cmp(scratch, Operand(last)); |
+ DeoptimizeIf(hi, instr->environment()); |
+ } |
+ } |
} else { |
- DeoptimizeIf(lo, instr->environment()); |
- // Omit check for the last type. |
- if (last != LAST_TYPE) { |
- __ cmp(scratch, Operand(last)); |
- DeoptimizeIf(hi, instr->environment()); |
+ uint8_t mask = instr->hydrogen()->mask(); |
+ uint8_t tag = instr->hydrogen()->tag(); |
+ |
+ if (IsPowerOf2(mask)) { |
+ ASSERT(tag == 0 || IsPowerOf2(tag)); |
+ __ tst(scratch, Operand(mask)); |
+ DeoptimizeIf(tag == 0 ? ne : eq, instr->environment()); |
+ } else { |
+ __ and_(scratch, scratch, Operand(mask)); |
+ __ cmp(scratch, Operand(tag)); |
+ DeoptimizeIf(ne, instr->environment()); |
} |
} |
} |