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