summaryrefslogtreecommitdiffstats
path: root/llvm/test/MC
diff options
context:
space:
mode:
authorSameer AbuAsal <sabuasal@codeaurora.org>2018-03-02 22:04:12 +0000
committerSameer AbuAsal <sabuasal@codeaurora.org>2018-03-02 22:04:12 +0000
commit2646a41e54ba858fdcb0d52fb7286af5ecbc0d38 (patch)
treebe04597a8f2c3cd5a6b48af93145177e8cbe874c /llvm/test/MC
parente403c862cc0788236269730e272c91fec74c4a9a (diff)
downloadbcm5719-llvm-2646a41e54ba858fdcb0d52fb7286af5ecbc0d38.tar.gz
bcm5719-llvm-2646a41e54ba858fdcb0d52fb7286af5ecbc0d38.zip
[RISCV] Implement MC relaxations for compressed instructions.
Summary: This patch implements relaxation for RISCV in the MC layer. The following relaxations are currently handled: 1) Relax C_BEQZ to BEQ and C_BNEZ to BNEZ in RISCV. 2) Relax and C_J $imm to JAL x0, $imm and CJAL to JAL ra, $imm. Reviewers: asb, llvm-commits, efriedma Reviewed By: asb Subscribers: shiva0217 Differential Revision: https://reviews.llvm.org/D43055 llvm-svn: 326626
Diffstat (limited to 'llvm/test/MC')
-rw-r--r--llvm/test/MC/RISCV/fixups-compressed.s9
-rw-r--r--llvm/test/MC/RISCV/relocations.s6
-rw-r--r--llvm/test/MC/RISCV/rv32-relaxation.s75
-rw-r--r--llvm/test/MC/RISCV/rv64-relaxation.s64
4 files changed, 151 insertions, 3 deletions
diff --git a/llvm/test/MC/RISCV/fixups-compressed.s b/llvm/test/MC/RISCV/fixups-compressed.s
index 65e4c773eca..a97d290f216 100644
--- a/llvm/test/MC/RISCV/fixups-compressed.s
+++ b/llvm/test/MC/RISCV/fixups-compressed.s
@@ -2,13 +2,15 @@
# RUN: | FileCheck -check-prefix=CHECK-FIXUP %s
# RUN: llvm-mc -triple riscv32 -filetype=obj -mattr=+c < %s \
# RUN: | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INSTR %s
+# RUN: llvm-mc -filetype=obj -mattr=+c -triple=riscv32 %s \
+# RUN: | llvm-readobj -r | FileCheck %s -check-prefix=CHECK-REL
.LBB0_2:
# CHECK-FIXUP: fixup A - offset: 0, value: .LBB0_2, kind: fixup_riscv_rvc_jump
# CHECK-INSTR: c.j 0
c.j .LBB0_2
# CHECK: fixup A - offset: 0, value: func1, kind: fixup_riscv_rvc_jump
-# CHECK-INSTR: c.jal 0
+# CHECK-INSTR: c.jal 6
c.jal func1
# CHECK-FIXUP: fixup A - offset: 0, value: .LBB0_2, kind: fixup_riscv_rvc_branch
# CHECK-INSTR: c.beqz a3, -4
@@ -16,3 +18,8 @@ c.beqz a3, .LBB0_2
# CHECK-FIXUP: fixup A - offset: 0, value: .LBB0_2, kind: fixup_riscv_rvc_branch
# CHECK-INSTR: c.bnez a5, -6
c.bnez a5, .LBB0_2
+
+func1:
+ nop
+
+# CHECK-REL-NOT: R_RISCV
diff --git a/llvm/test/MC/RISCV/relocations.s b/llvm/test/MC/RISCV/relocations.s
index 13c6b512f26..77421620e68 100644
--- a/llvm/test/MC/RISCV/relocations.s
+++ b/llvm/test/MC/RISCV/relocations.s
@@ -85,11 +85,13 @@ bgeu a0, a1, foo
# FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_branch
c.jal foo
-# RELOC: R_RISCV_RVC_JUMP
+# A compressed jump (c.j) to an unresolved symbol will be relaxed to a (jal).
+# RELOC: R_RISCV_JAL
# INSTR: c.jal foo
# FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_rvc_jump
c.bnez a0, foo
-# RELOC: R_RISCV_RVC_BRANCH
+# A compressed branch (c.bnez) to an unresolved symbol will be relaxed to a (bnez).
+# RELOC: R_RISCV_BRANCH
# INSTR: c.bnez a0, foo
# FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_rvc_branch
diff --git a/llvm/test/MC/RISCV/rv32-relaxation.s b/llvm/test/MC/RISCV/rv32-relaxation.s
new file mode 100644
index 00000000000..66109faf3eb
--- /dev/null
+++ b/llvm/test/MC/RISCV/rv32-relaxation.s
@@ -0,0 +1,75 @@
+# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c < %s \
+# RUN: | llvm-objdump -d - | FileCheck -check-prefix=INSTR %s
+
+FAR_JUMP_NEGATIVE:
+ c.nop
+.space 2000
+
+FAR_BRANCH_NEGATIVE:
+ c.nop
+.space 256
+
+NEAR_NEGATIVE:
+ c.nop
+
+start:
+ c.bnez a0, NEAR
+#INSTR: c.bnez a0, 72
+ c.bnez a0, NEAR_NEGATIVE
+#INSTR: c.bnez a0, -4
+ c.bnez a0, FAR_BRANCH
+#INSTR-NEXT: bnez a0, 326
+ c.bnez a0, FAR_BRANCH_NEGATIVE
+#INSTR-NEXT: bnez a0, -268
+ c.bnez a0, FAR_JUMP
+#INSTR-NEXT: bnez a0, 2320
+ c.bnez a0, FAR_JUMP_NEGATIVE
+#INSTR-NEXT: bnez a0, -2278
+
+ c.beqz a0, NEAR
+#INSTR-NEXT: c.beqz a0, 52
+ c.beqz a0, NEAR_NEGATIVE
+#INSTR-NEXT: c.beqz a0, -24
+ c.beqz a0, FAR_BRANCH
+#INSTR-NEXT: beqz a0, 306
+ c.beqz a0, FAR_BRANCH_NEGATIVE
+#INSTR-NEXT: beqz a0, -288
+ c.beqz a0, FAR_JUMP
+#INSTR-NEXT: beqz a0, 2300
+ c.beqz a0, FAR_JUMP_NEGATIVE
+#INSTR-NEXT: beqz a0, -2298
+
+ c.j NEAR
+#INSTR-NEXT: c.j 32
+ c.j NEAR_NEGATIVE
+#INSTR-NEXT: c.j -44
+ c.j FAR_BRANCH
+#INSTR-NEXT: c.j 286
+ c.j FAR_BRANCH_NEGATIVE
+#INSTR-NEXT: c.j -306
+ c.j FAR_JUMP
+#INSTR-NEXT: j 2284
+ c.j FAR_JUMP_NEGATIVE
+#INSTR-NEXT: j -2314
+
+ c.jal NEAR
+#INSTR: c.jal 16
+ c.jal NEAR_NEGATIVE
+#INSTR: c.jal -60
+ c.jal FAR_BRANCH
+#INSTR-NEXT: c.jal 270
+ c.jal FAR_BRANCH_NEGATIVE
+#INSTR-NEXT: c.jal -322
+ c.jal FAR_JUMP
+#INSTR-NEXT: jal 2268
+ c.jal FAR_JUMP_NEGATIVE
+#INSTR-NEXT: jal -2330
+
+NEAR:
+ c.nop
+.space 256
+FAR_BRANCH:
+ c.nop
+.space 2000
+FAR_JUMP:
+ c.nop
diff --git a/llvm/test/MC/RISCV/rv64-relaxation.s b/llvm/test/MC/RISCV/rv64-relaxation.s
new file mode 100644
index 00000000000..018408f575a
--- /dev/null
+++ b/llvm/test/MC/RISCV/rv64-relaxation.s
@@ -0,0 +1,64 @@
+# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+c < %s \
+# RUN: | llvm-objdump -d - | FileCheck -check-prefix=INSTR %s
+
+FAR_JUMP_NEGATIVE:
+ c.nop
+.space 2000
+
+FAR_BRANCH_NEGATIVE:
+ c.nop
+.space 256
+
+NEAR_NEGATIVE:
+ c.nop
+
+start:
+ c.bnez a0, NEAR
+#INSTR: c.bnez a0, 56
+ c.bnez a0, NEAR_NEGATIVE
+#INSTR: c.bnez a0, -4
+ c.bnez a0, FAR_BRANCH
+#INSTR-NEXT: bnez a0, 310
+ c.bnez a0, FAR_BRANCH_NEGATIVE
+#INSTR-NEXT: bnez a0, -268
+ c.bnez a0, FAR_JUMP
+#INSTR-NEXT: bnez a0, 2304
+ c.bnez a0, FAR_JUMP_NEGATIVE
+#INSTR-NEXT: bnez a0, -2278
+
+ c.beqz a0, NEAR
+#INSTR-NEXT: c.beqz a0, 36
+ c.beqz a0, NEAR_NEGATIVE
+#INSTR-NEXT: c.beqz a0, -24
+ c.beqz a0, FAR_BRANCH
+#INSTR-NEXT: beqz a0, 290
+ c.beqz a0, FAR_BRANCH_NEGATIVE
+#INSTR-NEXT: beqz a0, -288
+ c.beqz a0, FAR_JUMP
+#INSTR-NEXT: beqz a0, 2284
+ c.beqz a0, FAR_JUMP_NEGATIVE
+#INSTR-NEXT: beqz a0, -2298
+
+ c.j NEAR
+#INSTR-NEXT: c.j 16
+ c.j NEAR_NEGATIVE
+#INSTR-NEXT: c.j -44
+ c.j FAR_BRANCH
+#INSTR-NEXT: c.j 270
+ c.j FAR_BRANCH_NEGATIVE
+#INSTR-NEXT: c.j -306
+ c.j FAR_JUMP
+#INSTR-NEXT: j 2268
+ c.j FAR_JUMP_NEGATIVE
+#INSTR-NEXT: j -2314
+
+NEAR:
+ c.nop
+
+.space 256
+FAR_BRANCH:
+ c.nop
+
+.space 2000
+FAR_JUMP:
+ c.nop
OpenPOWER on IntegriCloud