Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 4be6d264a8f69d16cebe90c1a986703e2ccb0615..d1d6db5d17506894aad74195e18918210d94d651 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -2369,24 +2369,6 @@ void LCodeGen::DoInstanceOf(LInstanceOf* instr) { |
void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { |
- class DeferredInstanceOfKnownGlobal: public LDeferredCode { |
- public: |
- DeferredInstanceOfKnownGlobal(LCodeGen* codegen, |
- LInstanceOfKnownGlobal* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
- virtual void Generate() { |
- codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); |
- } |
- virtual LInstruction* instr() { return instr_; } |
- Label* map_check() { return &map_check_; } |
- private: |
- LInstanceOfKnownGlobal* instr_; |
- Label map_check_; |
- }; |
- |
- DeferredInstanceOfKnownGlobal* deferred; |
- deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr); |
- |
Label done, false_result; |
Register object = ToRegister(instr->InputAt(0)); |
Register temp = ToRegister(instr->TempAt(0)); |
@@ -2401,14 +2383,14 @@ void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { |
// This is the inlined call site instanceof cache. The two occurences of the |
// hole value will be patched to the last map/result pair generated by the |
// instanceof stub. |
- Label cache_miss; |
+ Label cache_miss, map_check_site; |
Register map = temp; |
__ ldr(map, FieldMemOperand(object, HeapObject::kMapOffset)); |
{ |
// Block constant pool emission to ensure the positions of instructions are |
// as expected by the patcher. See InstanceofStub::Generate(). |
Assembler::BlockConstPoolScope block_const_pool(masm()); |
- __ bind(deferred->map_check()); // Label for calculating code patching. |
+ __ bind(&map_check_site); // Label for calculating code patching. |
// We use Factory::the_hole_value() on purpose instead of loading from the |
// root array to force relocation to be able to later patch with |
// the cached map. |
@@ -2437,24 +2419,7 @@ void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { |
Condition is_string = masm_->IsObjectStringType(object, temp); |
__ b(is_string, &false_result); |
- // Go to the deferred code. |
- __ b(deferred->entry()); |
- |
- __ bind(&false_result); |
- __ LoadRoot(result, Heap::kFalseValueRootIndex); |
- |
- // Here result has either true or false. Deferred code also produces true or |
- // false object. |
- __ bind(deferred->exit()); |
- __ bind(&done); |
-} |
- |
- |
-void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, |
- Label* map_check) { |
- Register result = ToRegister(instr->result()); |
- ASSERT(result.is(r0)); |
- |
+ // Slow case. |
InstanceofStub::Flags flags = InstanceofStub::kNoFlags; |
flags = static_cast<InstanceofStub::Flags>( |
flags | InstanceofStub::kArgsInRegisters); |
@@ -2464,30 +2429,35 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, |
flags | InstanceofStub::kReturnTrueFalseObject); |
InstanceofStub stub(flags); |
- PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
+ { PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
+ |
+ __ LoadHeapObject(InstanceofStub::right(), instr->function()); |
+ static const int kAdditionalDelta = 4; |
+ int delta = |
+ masm()->InstructionsGeneratedSince(&map_check_site) + kAdditionalDelta; |
+ Label before_push_delta; |
+ __ bind(&before_push_delta); |
+ __ BlockConstPoolFor(kAdditionalDelta); |
+ __ mov(temp, Operand(delta * kPointerSize)); |
+ __ StoreToSafepointRegisterSlot(temp, temp); |
+ CallCodeGeneric(stub.GetCode(), |
+ RelocInfo::CODE_TARGET, |
+ instr, |
+ RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
+ LEnvironment* env = instr->GetDeferredLazyDeoptimizationEnvironment(); |
+ safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
+ // Put the result value into the result register slot and |
+ // restore all registers. |
+ __ StoreToSafepointRegisterSlot(result, result); |
+ __ b(&done); |
+ } |
- // Get the temp register reserved by the instruction. This needs to be r4 as |
- // its slot of the pushing of safepoint registers is used to communicate the |
- // offset to the location of the map check. |
- Register temp = ToRegister(instr->TempAt(0)); |
- ASSERT(temp.is(r4)); |
- __ LoadHeapObject(InstanceofStub::right(), instr->function()); |
- static const int kAdditionalDelta = 4; |
- int delta = masm_->InstructionsGeneratedSince(map_check) + kAdditionalDelta; |
- Label before_push_delta; |
- __ bind(&before_push_delta); |
- __ BlockConstPoolFor(kAdditionalDelta); |
- __ mov(temp, Operand(delta * kPointerSize)); |
- __ StoreToSafepointRegisterSlot(temp, temp); |
- CallCodeGeneric(stub.GetCode(), |
- RelocInfo::CODE_TARGET, |
- instr, |
- RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
- LEnvironment* env = instr->GetDeferredLazyDeoptimizationEnvironment(); |
- safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
- // Put the result value into the result register slot and |
- // restore all registers. |
- __ StoreToSafepointRegisterSlot(result, result); |
+ __ bind(&false_result); |
+ __ LoadRoot(result, Heap::kFalseValueRootIndex); |
+ |
+ // Here result has either true or false. Deferred code also produces true or |
+ // false object. |
+ __ bind(&done); |
} |