|
| 1 | +# REQUIRES: loongarch |
| 2 | +## Test LA64 IE -> LE in various cases. |
| 3 | + |
| 4 | +# RUN: llvm-mc --filetype=obj --triple=loongarch64 -mattr=+relax %s -o %t.o |
| 5 | + |
| 6 | +## FIXME: IE relaxation has not yet been implemented. |
| 7 | +## --relax/--no-relax has the same result. Also check --emit-relocs. |
| 8 | +# RUN: ld.lld --emit-relocs %t.o -o %t |
| 9 | +# RUN: llvm-readelf -x .got %t 2>&1 | FileCheck --check-prefix=LE-GOT %s |
| 10 | +# RUN: llvm-objdump -dr --no-show-raw-insn %t | FileCheck --check-prefixes=LE %s |
| 11 | + |
| 12 | +# RUN: ld.lld --emit-relocs --no-relax %t.o -o %t.norelax |
| 13 | +# RUN: llvm-readelf -x .got %t.norelax 2>&1 | FileCheck --check-prefix=LE-GOT %s |
| 14 | +# RUN: llvm-objdump -dr --no-show-raw-insn %t.norelax | FileCheck --check-prefixes=LE %s |
| 15 | + |
| 16 | +# LE-GOT: could not find section '.got' |
| 17 | + |
| 18 | +# a@tprel = st_value(a) = 0xfff |
| 19 | +# b@tprel = st_value(a) = 0x1000 |
| 20 | +# LE: 20158: nop |
| 21 | +# LE-NEXT: R_LARCH_TLS_IE_PC_HI20 a |
| 22 | +# LE-NEXT: R_LARCH_RELAX *ABS* |
| 23 | +# LE-NEXT: ori $a0, $zero, 4095 |
| 24 | +# LE-NEXT: R_LARCH_TLS_IE_PC_LO12 a |
| 25 | +# LE-NEXT: R_LARCH_RELAX *ABS* |
| 26 | +# LE-NEXT: add.d $a0, $a0, $tp |
| 27 | +# LE-NEXT: 20164: lu12i.w $a1, 1 |
| 28 | +# LE-NEXT: R_LARCH_TLS_IE_PC_HI20 b |
| 29 | +# LE-NEXT: ori $a1, $a1, 0 |
| 30 | +# LE-NEXT: R_LARCH_TLS_IE_PC_LO12 b |
| 31 | +# LE-NEXT: add.d $a1, $a1, $tp |
| 32 | +# LE-NEXT: 20170: nop |
| 33 | +# LE-NEXT: R_LARCH_TLS_IE_PC_HI20 a |
| 34 | +# LE-NEXT: R_LARCH_RELAX *ABS* |
| 35 | +# LE-NEXT: lu12i.w $a3, 1 |
| 36 | +# LE-NEXT: R_LARCH_TLS_IE_PC_HI20 b |
| 37 | +# LE-NEXT: R_LARCH_RELAX *ABS* |
| 38 | +# LE-NEXT: ori $a2, $zero, 4095 |
| 39 | +# LE-NEXT: R_LARCH_TLS_IE_PC_LO12 a |
| 40 | +# LE-NEXT: ori $a3, $a3, 0 |
| 41 | +# LE-NEXT: R_LARCH_TLS_IE_PC_LO12 b |
| 42 | +# LE-NEXT: add.d $a2, $a2, $tp |
| 43 | +# LE-NEXT: add.d $a3, $a3, $tp |
| 44 | + |
| 45 | +la.tls.ie $a0, a # relax |
| 46 | +add.d $a0, $a0, $tp |
| 47 | + |
| 48 | +# PCALAU12I does not have R_LARCH_RELAX. No relaxation. |
| 49 | +pcalau12i $a1, %ie_pc_hi20(b) |
| 50 | +ld.d $a1, $a1, %ie_pc_lo12(b) |
| 51 | +add.d $a1, $a1, $tp |
| 52 | + |
| 53 | +# Test instructions are interleaved. |
| 54 | +# PCALAU12I has an R_LARCH_RELAX. We preform relaxation. |
| 55 | +pcalau12i $a2, %ie_pc_hi20(a) |
| 56 | +.reloc .-4, R_LARCH_RELAX, 0 |
| 57 | +pcalau12i $a3, %ie_pc_hi20(b) |
| 58 | +.reloc .-4, R_LARCH_RELAX, 0 |
| 59 | +ld.d $a2, $a2, %ie_pc_lo12(a) |
| 60 | +ld.d $a3, $a3, %ie_pc_lo12(b) |
| 61 | +add.d $a2, $a2, $tp |
| 62 | +add.d $a3, $a3, $tp |
| 63 | + |
| 64 | +.section .tbss,"awT",@nobits |
| 65 | +.globl a |
| 66 | +.zero 0xfff ## Place a at 0xfff, LE needs only one ins. |
| 67 | +a: |
| 68 | +.zero 1 ## Place b at 0x1000, LE needs two ins. |
| 69 | +b: |
| 70 | +.zero 4 |
0 commit comments