Chromium Code Reviews| Index: src/arm/macro-assembler-arm.cc |
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
| index 47d42a3122073e988ee8985047244a19a51e8b67..9242c743e26a657d2faad4275221afa14b0e64f0 100644 |
| --- a/src/arm/macro-assembler-arm.cc |
| +++ b/src/arm/macro-assembler-arm.cc |
| @@ -2016,14 +2016,36 @@ void MacroAssembler::CompareObjectType(Register object, |
| Register map, |
| Register type_reg, |
| InstanceType type) { |
| + const Register temp = type_reg.is(no_reg) ? ip : type_reg; |
| + |
| + ldr(map, FieldMemOperand(object, HeapObject::kMapOffset)); |
| + CompareInstanceType(map, temp, type); |
| +} |
| + |
| + |
| +void MacroAssembler::CheckObjectTypeRange(Register object, |
| + Register map, |
| + InstanceType min_type, |
| + InstanceType max_type, |
| + Label* false_label) { |
| + STATIC_ASSERT(Map::kInstanceTypeOffset < 4096); |
| + STATIC_ASSERT(LAST_TYPE < 256); |
| ldr(map, FieldMemOperand(object, HeapObject::kMapOffset)); |
| - CompareInstanceType(map, type_reg, type); |
| + ldrb(ip, FieldMemOperand(map, Map::kInstanceTypeOffset)); |
| + sub(ip, ip, Operand(min_type)); |
| + cmp(ip, Operand(max_type - min_type)); |
| + b(hi, false_label); |
| } |
| void MacroAssembler::CompareInstanceType(Register map, |
| Register type_reg, |
| InstanceType type) { |
| + // Registers map and type_reg can be ip. These two lines assert |
| + // that ip can be used with the two instructions (the constants |
| + // won't never need ip). |
|
ulan
2013/11/22 15:43:46
nit: either "won't ever need" or "will never need"
|
| + STATIC_ASSERT(Map::kInstanceTypeOffset < 4096); |
| + STATIC_ASSERT(LAST_TYPE < 256); |
| ldrb(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset)); |
| cmp(type_reg, Operand(type)); |
| } |