Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Unified Diff: src/arm64/assembler-arm64.cc

Issue 363293004: ARM64: improve Adr patching (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/arm64/assembler-arm64.h ('k') | src/arm64/instructions-arm64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/arm64/assembler-arm64.cc
diff --git a/src/arm64/assembler-arm64.cc b/src/arm64/assembler-arm64.cc
index ce4f451238129cbbc4d174455540f64acc533e1a..240dc9c3572a2dfd4d84cdc6dd6ecb9b8f79bcfc 100644
--- a/src/arm64/assembler-arm64.cc
+++ b/src/arm64/assembler-arm64.cc
@@ -3088,31 +3088,12 @@ void Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) {
}
-void PatchingAssembler::MovInt64(const Register& rd, int64_t imm) {
- Label start;
- bind(&start);
-
- ASSERT(rd.Is64Bits());
- ASSERT(!rd.IsSP());
-
- for (unsigned i = 0; i < (rd.SizeInBits() / 16); i++) {
- uint64_t imm16 = (imm >> (16 * i)) & 0xffffL;
- movk(rd, imm16, 16 * i);
- }
-
- ASSERT(SizeOfCodeGeneratedSince(&start) ==
- kMovInt64NInstrs * kInstructionSize);
-}
-
-
-void PatchingAssembler::PatchAdrFar(Instruction* target) {
+void PatchingAssembler::PatchAdrFar(ptrdiff_t target_offset) {
// The code at the current instruction should be:
// adr rd, 0
// nop (adr_far)
// nop (adr_far)
- // nop (adr_far)
// movz scratch, 0
- // add rd, rd, scratch
ulan 2014/07/03 10:36:20 Why not remove (nop, nop) instead of (nop, add)?
vincent.belliard 2014/07/03 10:46:06 The add has a cost (the processor doesn't know tha
ulan 2014/07/03 11:01:48 ok, thanks.
// Verify the expected code.
Instruction* expected_adr = InstructionAt(0);
@@ -3122,39 +3103,21 @@ void PatchingAssembler::PatchAdrFar(Instruction* target) {
CHECK(InstructionAt((i + 1) * kInstructionSize)->IsNop(ADR_FAR_NOP));
}
Instruction* expected_movz =
- InstructionAt((kAdrFarPatchableNInstrs - 2) * kInstructionSize);
+ InstructionAt((kAdrFarPatchableNInstrs - 1) * kInstructionSize);
CHECK(expected_movz->IsMovz() &&
(expected_movz->ImmMoveWide() == 0) &&
(expected_movz->ShiftMoveWide() == 0));
int scratch_code = expected_movz->Rd();
- Instruction* expected_add =
- InstructionAt((kAdrFarPatchableNInstrs - 1) * kInstructionSize);
- CHECK(expected_add->IsAddSubShifted() &&
- (expected_add->Mask(AddSubOpMask) == ADD) &&
- expected_add->SixtyFourBits() &&
- (expected_add->Rd() == rd_code) && (expected_add->Rn() == rd_code) &&
- (expected_add->Rm() == scratch_code) &&
- (static_cast<Shift>(expected_add->ShiftDP()) == LSL) &&
- (expected_add->ImmDPShift() == 0));
// Patch to load the correct address.
- Label start;
- bind(&start);
Register rd = Register::XRegFromCode(rd_code);
- // If the target is in range, we only patch the adr. Otherwise we patch the
- // nops with fixup instructions.
- int target_offset = expected_adr->DistanceTo(target);
- if (Instruction::IsValidPCRelOffset(target_offset)) {
- adr(rd, target_offset);
- for (int i = 0; i < kAdrFarPatchableNInstrs - 2; ++i) {
- nop(ADR_FAR_NOP);
- }
- } else {
- Register scratch = Register::XRegFromCode(scratch_code);
- adr(rd, 0);
- MovInt64(scratch, target_offset);
- add(rd, rd, scratch);
- }
+ Register scratch = Register::XRegFromCode(scratch_code);
+ // Addresses are only 48 bits.
+ adr(rd, target_offset & 0xFFFF);
+ movz(scratch, (target_offset >> 16) & 0xFFFF, 16);
+ movk(scratch, (target_offset >> 32) & 0xFFFF, 32);
+ ASSERT((target_offset >> 48) == 0);
+ add(rd, rd, scratch);
}
« no previous file with comments | « src/arm64/assembler-arm64.h ('k') | src/arm64/instructions-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698