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