Skip to content
Snippets Groups Projects
Commit 19ede2f5 authored by Simon Atanasyan's avatar Simon Atanasyan
Browse files

[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

llvm-svn: 373906
parent 8dc17009
No related branches found
No related tags found
No related merge requests found
...@@ -143,12 +143,15 @@ public: ...@@ -143,12 +143,15 @@ public:
return false; return false;
switch (Info->get(Inst.getOpcode()).OpInfo[NumOps - 1].OperandType) { switch (Info->get(Inst.getOpcode()).OpInfo[NumOps - 1].OperandType) {
case MCOI::OPERAND_UNKNOWN: case MCOI::OPERAND_UNKNOWN:
case MCOI::OPERAND_IMMEDIATE: case MCOI::OPERAND_IMMEDIATE: {
// jal, bal ... // j, jal, jalx, jals
Target = Inst.getOperand(NumOps - 1).getImm(); // 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; return true;
}
case MCOI::OPERAND_PCREL: case MCOI::OPERAND_PCREL:
// b, j, beq ... // b, beq ...
Target = Addr + Inst.getOperand(NumOps - 1).getImm(); Target = Addr + Inst.getOperand(NumOps - 1).getImm();
return true; return true;
default: default:
......
# 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
# 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment