[llvm] r373906 - [Mips] Fix evaluating J-format branch targets

Simon Atanasyan via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 7 07:01:22 PDT 2019


Author: atanasyan
Date: Mon Oct  7 07:01:22 2019
New Revision: 373906

URL: http://llvm.org/viewvc/llvm-project?rev=373906&view=rev
Log:
[Mips] Fix evaluating J-format branch targets

J/JAL/JALX/JALS are absolute branches, but stay within the current
256 MB-aligned region, so we must include the high bits of the
instruction address when calculating the branch target.

Patch by James Clarke.

Differential Revision: https://reviews.llvm.org/D68548

Added:
    llvm/trunk/test/MC/Mips/micromips-jump-pc-region.s
    llvm/trunk/test/MC/Mips/mips-jump-pc-region.s
Modified:
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp?rev=373906&r1=373905&r2=373906&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp Mon Oct  7 07:01:22 2019
@@ -143,12 +143,15 @@ public:
       return false;
     switch (Info->get(Inst.getOpcode()).OpInfo[NumOps - 1].OperandType) {
     case MCOI::OPERAND_UNKNOWN:
-    case MCOI::OPERAND_IMMEDIATE:
-      // jal, bal ...
-      Target = Inst.getOperand(NumOps - 1).getImm();
+    case MCOI::OPERAND_IMMEDIATE: {
+      // j, jal, jalx, jals
+      // Absolute branch within the current 256 MB-aligned region
+      uint64_t Region = Addr & ~uint64_t(0xfffffff);
+      Target = Region + Inst.getOperand(NumOps - 1).getImm();
       return true;
+    }
     case MCOI::OPERAND_PCREL:
-      // b, j, beq ...
+      // b, beq ...
       Target = Addr + Inst.getOperand(NumOps - 1).getImm();
       return true;
     default:

Added: llvm/trunk/test/MC/Mips/micromips-jump-pc-region.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/micromips-jump-pc-region.s?rev=373906&view=auto
==============================================================================
--- llvm/trunk/test/MC/Mips/micromips-jump-pc-region.s (added)
+++ llvm/trunk/test/MC/Mips/micromips-jump-pc-region.s Mon Oct  7 07:01:22 2019
@@ -0,0 +1,17 @@
+# RUN: llvm-mc -triple=mips -mcpu=mips32 -mattr=+micromips -filetype=obj < %s \
+# RUN:   | llvm-objdump -d - | FileCheck %s
+
+.set noreorder
+
+# Force us into the second 256 MB region with a non-zero instruction index
+.org 256*1024*1024 + 12
+# CHECK-LABEL: 1000000c foo:
+# CHECK-NEXT: 1000000c: d4 00 00 06                   j       12 <foo>
+# CHECK-NEXT: 10000010: f4 00 00 08                   jal     16 <foo+0x4>
+# CHECK-NEXT: 10000014: f0 00 00 05                   jalx    20 <foo+0x8>
+# CHECK-NEXT: 10000018: 74 00 00 0c                   jals    24 <foo+0xc>
+foo:
+	j 12
+	jal 16
+	jalx 20
+	jals 24

Added: llvm/trunk/test/MC/Mips/mips-jump-pc-region.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/mips-jump-pc-region.s?rev=373906&view=auto
==============================================================================
--- llvm/trunk/test/MC/Mips/mips-jump-pc-region.s (added)
+++ llvm/trunk/test/MC/Mips/mips-jump-pc-region.s Mon Oct  7 07:01:22 2019
@@ -0,0 +1,17 @@
+# RUN: llvm-mc -triple=mips -mcpu=mips32 -filetype=obj < %s \
+# RUN:   | llvm-objdump -d - | FileCheck %s
+# RUN: llvm-mc -triple=mips64 -mcpu=mips64 -filetype=obj < %s \
+# RUN:   | llvm-objdump -d - | FileCheck %s
+
+.set noreorder
+
+# Force us into the second 256 MB region with a non-zero instruction index
+.org 256*1024*1024 + 12
+# CHECK-LABEL: 1000000c foo:
+# CHECK-NEXT: 1000000c: 08 00 00 03                   j       12 <foo>
+# CHECK-NEXT: 10000010: 0c 00 00 04                   jal     16 <foo+0x4>
+# CHECK-NEXT: 10000014: 74 00 00 05                   jalx    20 <foo+0x8>
+foo:
+	j 12
+	jal 16
+	jalx 20




More information about the llvm-commits mailing list