Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index 177685e61f7b14be432d705c3cd2e55d2ba105c6..f82df461258d214b31e3fe6c260e4344d4dcf5fd 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -228,7 +228,7 @@ const char* DwVfpRegister::AllocationIndexToString(int index) { |
// Implementation of RelocInfo |
// static |
-const int RelocInfo::kApplyMask = 1 << RelocInfo::INTERNAL_REFERENCE; |
+const int RelocInfo::kApplyMask = 0; |
bool RelocInfo::IsCodedSpecially() { |
@@ -776,20 +776,14 @@ int Assembler::target_at(int pos) { |
// Emitted link to a label, not part of a branch. |
return instr; |
} |
- if ((instr & 7 * B25) == 5 * B25) { |
- int imm26 = ((instr & kImm24Mask) << 8) >> 6; |
- // b, bl, or blx imm24 |
- if ((Instruction::ConditionField(instr) == kSpecialCondition) && |
- ((instr & B24) != 0)) { |
- // blx uses bit 24 to encode bit 2 of imm26 |
- imm26 += 2; |
- } |
- return pos + kPcLoadDelta + imm26; |
+ DCHECK_EQ(5 * B25, instr & 7 * B25); // b, bl, or blx imm24 |
+ int imm26 = ((instr & kImm24Mask) << 8) >> 6; |
+ if ((Instruction::ConditionField(instr) == kSpecialCondition) && |
+ ((instr & B24) != 0)) { |
+ // blx uses bit 24 to encode bit 2 of imm26 |
+ imm26 += 2; |
} |
- // Internal reference to the label. |
- DCHECK_EQ(7 * B25 | 1 * B0, instr & (7 * B25 | 1 * B0)); |
- int imm26 = (((instr >> 1) & kImm24Mask) << 8) >> 6; |
- return pos + imm26; |
+ return pos + kPcLoadDelta + imm26; |
} |
@@ -863,25 +857,19 @@ void Assembler::target_at_put(int pos, int target_pos) { |
} |
return; |
} |
- if ((instr & 7 * B25) == 5 * B25) { |
- // b, bl, or blx imm24 |
- int imm26 = target_pos - (pos + kPcLoadDelta); |
- if (Instruction::ConditionField(instr) == kSpecialCondition) { |
- // blx uses bit 24 to encode bit 2 of imm26 |
- DCHECK((imm26 & 1) == 0); |
- instr = (instr & ~(B24 | kImm24Mask)) | ((imm26 & 2) >> 1) * B24; |
- } else { |
- DCHECK((imm26 & 3) == 0); |
- instr &= ~kImm24Mask; |
- } |
- int imm24 = imm26 >> 2; |
- DCHECK(is_int24(imm24)); |
- instr_at_put(pos, instr | (imm24 & kImm24Mask)); |
- return; |
+ int imm26 = target_pos - (pos + kPcLoadDelta); |
+ DCHECK_EQ(5 * B25, instr & 7 * B25); // b, bl, or blx imm24 |
+ if (Instruction::ConditionField(instr) == kSpecialCondition) { |
+ // blx uses bit 24 to encode bit 2 of imm26 |
+ DCHECK_EQ(0, imm26 & 1); |
+ instr = (instr & ~(B24 | kImm24Mask)) | ((imm26 & 2) >> 1) * B24; |
+ } else { |
+ DCHECK_EQ(0, imm26 & 3); |
+ instr &= ~kImm24Mask; |
} |
- // Patch internal reference to label. |
- DCHECK_EQ(7 * B25 | 1 * B0, instr & (7 * B25 | 1 * B0)); |
- instr_at_put(pos, reinterpret_cast<Instr>(buffer_ + target_pos)); |
+ int imm24 = imm26 >> 2; |
+ DCHECK(is_int24(imm24)); |
+ instr_at_put(pos, instr | (imm24 & kImm24Mask)); |
} |
@@ -3561,16 +3549,9 @@ void Assembler::GrowBuffer() { |
reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, |
reloc_info_writer.last_pc() + pc_delta); |
- // Relocate internal references. |
- for (RelocIterator it(desc); !it.done(); it.next()) { |
- if (it.rinfo()->rmode() == RelocInfo::INTERNAL_REFERENCE) { |
- // Don't patch unbound internal references (bit 0 set); those are still |
- // hooked up in the Label chain and will be automatically patched once |
- // the label is bound. |
- int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); |
- if ((*p & 1 * B0) == 0) *p += pc_delta; |
- } |
- } |
+ // None of our relocation types are pc relative pointing outside the code |
+ // buffer nor pc absolute pointing inside the code buffer, so there is no need |
+ // to relocate any emitted relocation entries. |
// Relocate pending relocation entries. |
for (int i = 0; i < num_pending_32_bit_reloc_info_; i++) { |
@@ -3614,37 +3595,6 @@ void Assembler::dd(uint32_t data) { |
} |
-void Assembler::dd(Label* label) { |
- CheckBuffer(); |
- RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE); |
- if (label->is_bound()) { |
- uint32_t data = reinterpret_cast<uint32_t>(buffer_ + label->pos()); |
- DCHECK_EQ(0u, data & 1 * B0); |
- *reinterpret_cast<uint32_t*>(pc_) = data; |
- pc_ += sizeof(uint32_t); |
- } else { |
- int target_pos; |
- if (label->is_linked()) { |
- // Point to previous instruction that uses the link. |
- target_pos = label->pos(); |
- } else { |
- // First entry of the link chain points to itself. |
- target_pos = pc_offset(); |
- } |
- label->link_to(pc_offset()); |
- // Encode internal reference to unbound label. We set the least significant |
- // bit to distinguish unbound internal references in GrowBuffer() below. |
- int imm26 = target_pos - pc_offset(); |
- DCHECK_EQ(0, imm26 & 3); |
- int imm24 = imm26 >> 2; |
- DCHECK(is_int24(imm24)); |
- // We use bit pattern 0000111<imm24>1 because that doesn't match any branch |
- // or load that would also appear on the label chain. |
- emit(7 * B25 | ((imm24 & kImm24Mask) << 1) | 1 * B0); |
- } |
-} |
- |
- |
void Assembler::emit_code_stub_address(Code* stub) { |
CheckBuffer(); |
*reinterpret_cast<uint32_t*>(pc_) = |