Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit 1494db6

Browse files
committed
[AArch64] Fix encoding for lsl #12 in add/sub immediates
Whenever an add/sub immediate needs a fixup, we set that immediate field to zero, which is correct, but we also set the shift bits to zero, which is not true for instructions that use lsl #12. This patch makes sure that if lsl #12 was used, it will appear in the encoding of the instruction. Differential Revision: https://reviews.llvm.org/D23930 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281898 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 21fcdfd commit 1494db6

File tree

4 files changed

+27
-12
lines changed

4 files changed

+27
-12
lines changed

lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ AArch64MCCodeEmitter::getAddSubImmOpValue(const MCInst &MI, unsigned OpIdx,
253253
assert((ShiftVal == 0 || ShiftVal == 12) &&
254254
"unexpected shift value for add/sub immediate");
255255
if (MO.isImm())
256-
return MO.getImm() | (ShiftVal == 0 ? 0 : (1 << 12));
256+
return MO.getImm() | (ShiftVal == 0 ? 0 : (1 << ShiftVal));
257257
assert(MO.isExpr() && "Unable to encode MCOperand!");
258258
const MCExpr *Expr = MO.getExpr();
259259

@@ -263,7 +263,7 @@ AArch64MCCodeEmitter::getAddSubImmOpValue(const MCInst &MI, unsigned OpIdx,
263263

264264
++MCNumFixups;
265265

266-
return 0;
266+
return ShiftVal == 0 ? 0 : (1 << ShiftVal);
267267
}
268268

269269
/// getCondBranchTargetOpValue - Return the encoded value for a conditional
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: llvm-mc -triple=aarch64-darwin -filetype=obj %s -o - | \
2+
// RUN: llvm-objdump -r -d - | FileCheck -check-prefix=OBJ %s
3+
4+
// OBJ-LABEL: Disassembly of section __TEXT,__text:
5+
6+
add x2, x3, _data@pageoff
7+
// OBJ: [[addr:[0-9a-f]+]]: 62 00 00 91 add x2, x3, #0
8+
// OBJ-NEXT: [[addr]]: ARM64_RELOC_PAGEOFF12 _data
9+
10+
add x2, x3, #_data@pageoff, lsl #12
11+
// OBJ: [[addr:[0-9a-f]+]]: 62 00 40 91 add x2, x3, #0, lsl #12
12+
// OBJ-NEXT: [[addr]]: ARM64_RELOC_PAGEOFF12 _data

test/MC/AArch64/elf-reloc-addsubimm.s

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
// RUN: llvm-mc -triple=aarch64-none-linux-gnu -filetype=obj %s -o - | \
2-
// RUN: llvm-readobj -r | FileCheck -check-prefix=OBJ %s
2+
// RUN: llvm-objdump -r -d - | FileCheck -check-prefix=OBJ %s
3+
4+
// OBJ-LABEL: Disassembly of section .text:
35

46
add x2, x3, #:lo12:some_label
7+
// OBJ: [[addr:[0-9a-f]+]]: 62 00 00 91 add x2, x3, #0
8+
// OBJ-NEXT: [[addr]]: R_AARCH64_ADD_ABS_LO12_NC some_label
9+
10+
add x2, x3, #:lo12:some_label, lsl #12
11+
// OBJ: [[addr:[0-9a-f]+]]: 62 00 40 91 add x2, x3, #0, lsl #12
12+
// OBJ-NEXT: [[addr]]: R_AARCH64_ADD_ABS_LO12_NC some_label
513

6-
// OBJ: Relocations [
7-
// OBJ-NEXT: Section {{.*}} .rela.text {
8-
// OBJ-NEXT: 0x0 R_AARCH64_ADD_ABS_LO12_NC some_label 0x0
9-
// OBJ-NEXT: }
10-
// OBJ-NEXT: ]

test/MC/AArch64/tls-relocs.s

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@
9292
add x17, x18, #:dtprel_hi12:var, lsl #12
9393
add w19, w20, #:dtprel_hi12:var, lsl #12
9494

95-
// CHECK: add x17, x18, :dtprel_hi12:var, lsl #12 // encoding: [0x51,0bAAAAAA10,0b00AAAAAA,0x91]
95+
// CHECK: add x17, x18, :dtprel_hi12:var, lsl #12 // encoding: [0x51,0bAAAAAA10,0b01AAAAAA,0x91]
9696
// CHECK: // fixup A - offset: 0, value: :dtprel_hi12:var, kind: fixup_aarch64_add_imm12
97-
// CHECK: add w19, w20, :dtprel_hi12:var, lsl #12 // encoding: [0x93,0bAAAAAA10,0b00AAAAAA,0x11]
97+
// CHECK: add w19, w20, :dtprel_hi12:var, lsl #12 // encoding: [0x93,0bAAAAAA10,0b01AAAAAA,0x11]
9898
// CHECK: // fixup A - offset: 0, value: :dtprel_hi12:var, kind: fixup_aarch64_add_imm12
9999

100100
// CHECK-ELF-NEXT: 0x40 R_AARCH64_TLSLD_ADD_DTPREL_HI12 [[VARSYM]]
@@ -294,9 +294,9 @@
294294
add x17, x18, #:tprel_hi12:var, lsl #12
295295
add w19, w20, #:tprel_hi12:var, lsl #12
296296

297-
// CHECK: add x17, x18, :tprel_hi12:var, lsl #12 // encoding: [0x51,0bAAAAAA10,0b00AAAAAA,0x91]
297+
// CHECK: add x17, x18, :tprel_hi12:var, lsl #12 // encoding: [0x51,0bAAAAAA10,0b01AAAAAA,0x91]
298298
// CHECK: // fixup A - offset: 0, value: :tprel_hi12:var, kind: fixup_aarch64_add_imm12
299-
// CHECK: add w19, w20, :tprel_hi12:var, lsl #12 // encoding: [0x93,0bAAAAAA10,0b00AAAAAA,0x11]
299+
// CHECK: add w19, w20, :tprel_hi12:var, lsl #12 // encoding: [0x93,0bAAAAAA10,0b01AAAAAA,0x11]
300300
// CHECK: // fixup A - offset: 0, value: :tprel_hi12:var, kind: fixup_aarch64_add_imm12
301301

302302
// CHECK-ELF-NEXT: 0xCC R_AARCH64_TLSLE_ADD_TPREL_HI12 [[VARSYM]]

0 commit comments

Comments
 (0)