|
@@ -0,0 +1,77 @@
|
|
|
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
+From: Clemens Backes <[email protected]>
|
|
|
+Date: Tue, 13 Dec 2022 22:37:27 +0100
|
|
|
+Subject: Merged: [arm] Do not emit the constant pool before a branch
|
|
|
+
|
|
|
+After computing the branch offset but before emitting the actual branch,
|
|
|
+we should not emit a constant pool. Otherwise the previously computed
|
|
|
+offset would be off.
|
|
|
+
|
|
|
+Instead of handling this indirectly via the Assembler::branch_offset
|
|
|
+method, do this directly in the Assembler::b method (and friends), so it
|
|
|
+is not missed on other call sites.
|
|
|
+
|
|
|
[email protected]
|
|
|
+
|
|
|
+(cherry picked from commit 9be597d194e108ba718610b9a611fe19a0fbfde5)
|
|
|
+Bug: chromium:1399424
|
|
|
+
|
|
|
+Change-Id: Ie30ba70508b4fb8913f79e049a33108608915704
|
|
|
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4118864
|
|
|
+Reviewed-by: Nico Hartmann <[email protected]>
|
|
|
+Commit-Queue: Clemens Backes <[email protected]>
|
|
|
+Cr-Commit-Position: refs/branch-heads/10.8@{#48}
|
|
|
+Cr-Branched-From: f1bc03fd6b4c201abd9f0fd9d51fb989150f97b9-refs/heads/10.8.168@{#1}
|
|
|
+Cr-Branched-From: 237de893e1c0a0628a57d0f5797483d3add7f005-refs/heads/main@{#83672}
|
|
|
+
|
|
|
+diff --git a/src/codegen/arm/assembler-arm.cc b/src/codegen/arm/assembler-arm.cc
|
|
|
+index 645edb17a4892aec70f0221cec889996a6868242..a95d4df308fd4651093a4911ad1c50226e059ebb 100644
|
|
|
+--- a/src/codegen/arm/assembler-arm.cc
|
|
|
++++ b/src/codegen/arm/assembler-arm.cc
|
|
|
+@@ -1462,10 +1462,6 @@ int Assembler::branch_offset(Label* L) {
|
|
|
+ L->link_to(pc_offset());
|
|
|
+ }
|
|
|
+
|
|
|
+- // Block the emission of the constant pool, since the branch instruction must
|
|
|
+- // be emitted at the pc offset recorded by the label.
|
|
|
+- if (!is_const_pool_blocked()) BlockConstPoolFor(1);
|
|
|
+-
|
|
|
+ return target_pos - (pc_offset() + Instruction::kPcLoadDelta);
|
|
|
+ }
|
|
|
+
|
|
|
+@@ -1476,6 +1472,11 @@ void Assembler::b(int branch_offset, Condition cond, RelocInfo::Mode rmode) {
|
|
|
+ int imm24 = branch_offset >> 2;
|
|
|
+ const bool b_imm_check = is_int24(imm24);
|
|
|
+ CHECK(b_imm_check);
|
|
|
++
|
|
|
++ // Block the emission of the constant pool before the next instruction.
|
|
|
++ // Otherwise the passed-in branch offset would be off.
|
|
|
++ BlockConstPoolFor(1);
|
|
|
++
|
|
|
+ emit(cond | B27 | B25 | (imm24 & kImm24Mask));
|
|
|
+
|
|
|
+ if (cond == al) {
|
|
|
+@@ -1490,6 +1491,11 @@ void Assembler::bl(int branch_offset, Condition cond, RelocInfo::Mode rmode) {
|
|
|
+ int imm24 = branch_offset >> 2;
|
|
|
+ const bool bl_imm_check = is_int24(imm24);
|
|
|
+ CHECK(bl_imm_check);
|
|
|
++
|
|
|
++ // Block the emission of the constant pool before the next instruction.
|
|
|
++ // Otherwise the passed-in branch offset would be off.
|
|
|
++ BlockConstPoolFor(1);
|
|
|
++
|
|
|
+ emit(cond | B27 | B25 | B24 | (imm24 & kImm24Mask));
|
|
|
+ }
|
|
|
+
|
|
|
+@@ -1499,6 +1505,11 @@ void Assembler::blx(int branch_offset) {
|
|
|
+ int imm24 = branch_offset >> 2;
|
|
|
+ const bool blx_imm_check = is_int24(imm24);
|
|
|
+ CHECK(blx_imm_check);
|
|
|
++
|
|
|
++ // Block the emission of the constant pool before the next instruction.
|
|
|
++ // Otherwise the passed-in branch offset would be off.
|
|
|
++ BlockConstPoolFor(1);
|
|
|
++
|
|
|
+ emit(kSpecialCondition | B27 | B25 | h | (imm24 & kImm24Mask));
|
|
|
+ }
|
|
|
+
|