Chromium Code Reviews| Index: src/arm/full-codegen-arm.cc |
| diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
| index 2eb5ccf974be3810a51f89c244bd661ff3e83ada..433f6872cda821450576d784b7ddba900189701c 100644 |
| --- a/src/arm/full-codegen-arm.cc |
| +++ b/src/arm/full-codegen-arm.cc |
| @@ -4838,7 +4838,14 @@ FullCodeGenerator::NestedStatement* FullCodeGenerator::TryFinally::Exit( |
| #undef __ |
| -static const int32_t kBranchBeforeInterrupt = 0x5a000004; |
| +static Address GetInterruptImmediateLoadAddress(Address pc) { |
| + Address immediate_load_address = pc - 2 * Assembler::kInstrSize; |
| + if (FLAG_enable_ool_constant_pool && |
| + Assembler::IsMovT(Memory::int32_at(immediate_load_address))) { |
|
Rodolph Perfetta (ARM)
2014/03/10 16:19:59
Is there a case where ool is enable and we don't h
rmcilroy
2014/03/11 19:05:53
Yes, the possibilities are:
existing inline const
|
| + immediate_load_address -= Assembler::kInstrSize; |
| + } |
| + return immediate_load_address; |
| +} |
| void BackEdgeTable::PatchAt(Code* unoptimized_code, |
| @@ -4846,37 +4853,23 @@ void BackEdgeTable::PatchAt(Code* unoptimized_code, |
| BackEdgeState target_state, |
| Code* replacement_code) { |
| static const int kInstrSize = Assembler::kInstrSize; |
| - Address branch_address = pc - 3 * kInstrSize; |
| + Address pc_immediate_load_address = GetInterruptImmediateLoadAddress(pc); |
| + Address branch_address = pc_immediate_load_address - kInstrSize; |
| + int branch_offset = (2 * kInstrSize) + (pc - pc_immediate_load_address); |
|
Rodolph Perfetta (ARM)
2014/03/10 16:19:59
Some comments about the 2 * kInstrSize would be ni
rmcilroy
2014/03/11 19:05:53
Done (and reworked the calculation to be more unde
|
| CodePatcher patcher(branch_address, 1); |
| - |
| switch (target_state) { |
| case INTERRUPT: |
| - // <decrement profiling counter> |
| - // 2a 00 00 01 bpl ok |
| - // e5 9f c? ?? ldr ip, [pc, <interrupt stub address>] |
| - // e1 2f ff 3c blx ip |
| - // ok-label |
| - patcher.masm()->b(4 * kInstrSize, pl); // Jump offset is 4 instructions. |
| - ASSERT_EQ(kBranchBeforeInterrupt, Memory::int32_at(branch_address)); |
| + patcher.masm()->b(branch_offset, pl); |
|
Rodolph Perfetta (ARM)
2014/03/10 16:19:59
While I agree the encoding isn't that interesting,
rmcilroy
2014/03/11 19:05:53
Done.
|
| + ASSERT(Assembler::IsBranch(Assembler::instr_at(branch_address))); |
|
Rodolph Perfetta (ARM)
2014/03/10 16:19:59
This assert check that b(...) will emit a branch,
rmcilroy
2014/03/11 19:05:53
Agreed, not useful. Removed.
|
| break; |
| case ON_STACK_REPLACEMENT: |
| case OSR_AFTER_STACK_CHECK: |
| - // <decrement profiling counter> |
| - // e1 a0 00 00 mov r0, r0 (NOP) |
| - // e5 9f c? ?? ldr ip, [pc, <on-stack replacement address>] |
| - // e1 2f ff 3c blx ip |
| - // ok-label |
| patcher.masm()->nop(); |
| break; |
| } |
| - Address pc_immediate_load_address = pc - 2 * kInstrSize; |
| - // Replace the call address. |
| - uint32_t interrupt_address_offset = |
| - Memory::uint16_at(pc_immediate_load_address) & 0xfff; |
| - Address interrupt_address_pointer = pc + interrupt_address_offset; |
| - Memory::uint32_at(interrupt_address_pointer) = |
| - reinterpret_cast<uint32_t>(replacement_code->entry()); |
| + Assembler::set_target_address_at(pc_immediate_load_address, unoptimized_code, |
| + replacement_code->entry()); |
| unoptimized_code->GetHeap()->incremental_marking()->RecordCodeTargetPatch( |
| unoptimized_code, pc_immediate_load_address, replacement_code); |
| @@ -4890,34 +4883,26 @@ BackEdgeTable::BackEdgeState BackEdgeTable::GetBackEdgeState( |
| static const int kInstrSize = Assembler::kInstrSize; |
| ASSERT(Memory::int32_at(pc - kInstrSize) == kBlxIp); |
| - Address branch_address = pc - 3 * kInstrSize; |
| - Address pc_immediate_load_address = pc - 2 * kInstrSize; |
| - uint32_t interrupt_address_offset = |
| - Memory::uint16_at(pc_immediate_load_address) & 0xfff; |
| - Address interrupt_address_pointer = pc + interrupt_address_offset; |
| - |
| - if (Memory::int32_at(branch_address) == kBranchBeforeInterrupt) { |
| - ASSERT(Memory::uint32_at(interrupt_address_pointer) == |
| - reinterpret_cast<uint32_t>( |
| - isolate->builtins()->InterruptCheck()->entry())); |
| - ASSERT(Assembler::IsLdrPcImmediateOffset( |
| - Assembler::instr_at(pc_immediate_load_address))); |
| + Address pc_immediate_load_address = GetInterruptImmediateLoadAddress(pc); |
| + Address branch_address = pc_immediate_load_address - kInstrSize; |
| + Address interrupt_address = Assembler::target_address_at( |
| + pc_immediate_load_address, unoptimized_code); |
| + |
| + if (Assembler::IsBranch(Assembler::instr_at(branch_address))) { |
| + ASSERT(interrupt_address == |
| + isolate->builtins()->InterruptCheck()->entry()); |
| return INTERRUPT; |
| } |
| ASSERT(Assembler::IsNop(Assembler::instr_at(branch_address))); |
| - ASSERT(Assembler::IsLdrPcImmediateOffset( |
| - Assembler::instr_at(pc_immediate_load_address))); |
| - if (Memory::uint32_at(interrupt_address_pointer) == |
| - reinterpret_cast<uint32_t>( |
| - isolate->builtins()->OnStackReplacement()->entry())) { |
| + if (interrupt_address == |
| + isolate->builtins()->OnStackReplacement()->entry()) { |
| return ON_STACK_REPLACEMENT; |
| } |
| - ASSERT(Memory::uint32_at(interrupt_address_pointer) == |
| - reinterpret_cast<uint32_t>( |
| - isolate->builtins()->OsrAfterStackCheck()->entry())); |
| + ASSERT(interrupt_address == |
| + isolate->builtins()->OsrAfterStackCheck()->entry()); |
| return OSR_AFTER_STACK_CHECK; |
| } |