blob: a91374b6e81a324668d89849d59e36ca3ead5e95 [file] [edit]
# REQUIRES: loongarch
# RUN: llvm-mc --filetype=obj --triple=loongarch32 -mattr=+relax --defsym ELF32=1 %s -o %t.32.o
# RUN: llvm-mc --filetype=obj --triple=loongarch64 -mattr=+relax %s -o %t.64.o
# RUN: ld.lld %t.32.o -o %t.32
# RUN: llvm-objdump -d --no-show-raw-insn %t.32 | FileCheck --check-prefixes=RELAX32 %s
# RUN: ld.lld %t.64.o -o %t.64
# RUN: llvm-objdump -d --no-show-raw-insn %t.64 | FileCheck --check-prefixes=RELAX64 %s
# RELAX32-LABEL: <_start>:
## .LANCHOR0@tprel = 8
# RELAX32-NEXT: addi.w $a0, $tp, 8
# RELAX32-NEXT: ld.w $a1, $a0, 0
# RELAX32-NEXT: ld.w $a2, $tp, 8
## .a@tprel - 4 = 0x7fc
# RELAX32-NEXT: addi.w $a1, $zero, 1
# RELAX32-NEXT: addi.w $a1, $a1, 2
# RELAX32-NEXT: st.w $a1, $tp, 2044
## .a@tprel = 0x800
# RELAX32-NEXT: lu12i.w $a0, 1
# RELAX32-NEXT: add.w $a0, $a0, $tp
# RELAX32-NEXT: addi.w $a0, $a0, -2048
# RELAX64-LABEL: <_start>:
## .LANCHOR0@tprel = 8
# RELAX64-NEXT: addi.d $a0, $tp, 8
# RELAX64-NEXT: ld.d $a1, $a0, 0
# RELAX64-NEXT: ld.d $a2, $tp, 8
## .a@tprel - 4 = 0x7fc
# RELAX64-NEXT: addi.d $a1, $zero, 1
# RELAX64-NEXT: addi.d $a1, $a1, 2
# RELAX64-NEXT: st.d $a1, $tp, 2044
## .a@tprel = 0x800
# RELAX64-NEXT: lu12i.w $a0, 1
# RELAX64-NEXT: add.d $a0, $a0, $tp
# RELAX64-NEXT: addi.d $a0, $a0, -2048
.macro add dst, src1, src2, src3
.ifdef ELF32
add.w \dst, \src1, \src2, \src3
.else
add.d \dst, \src1, \src2, \src3
.endif
.endm
.macro inst op dst, src1, src2
.ifdef ELF32
.ifc \op, addi
addi.w \dst, \src1, \src2
.else; .ifc \op, ld
ld.w \dst, \src1, \src2
.else; .ifc \op, st
st.w \dst, \src1, \src2
.else; .ifc \op, ldptr
ldptr.w \dst, \src1, \src2
.else
.error "Unknown op in ELF32 mode"
.endif; .endif; .endif; .endif
.else
.ifc \op, addi
addi.d \dst, \src1, \src2
.else; .ifc \op, ld
ld.d \dst, \src1, \src2
.else; .ifc \op, st
st.d \dst, \src1, \src2
.else; .ifc \op, ldptr
ldptr.d \dst, \src1, \src2
.else
.error "Unknown op in ELF64 mode"
.endif; .endif; .endif; .endif
.endif
.endm
.macro addi dst, src1, src2
inst addi \dst, \src1, \src2
.endm
.macro ld dst, src1, src2
inst ld \dst, \src1, \src2
.endm
.macro st dst, src1, src2
inst st \dst, \src1, \src2
.endm
.macro ldptr dst, src1, src2
inst ldptr \dst, \src1, \src2
.endm
_start:
## Test instructions not in pairs.
lu12i.w $a0, %le_hi20_r(.LANCHOR0)
add $a0, $a0, $tp, %le_add_r(.LANCHOR0)
addi $a0, $a0, %le_lo12_r(.LANCHOR0)
ld $a1, $a0, 0
ld $a2, $a0, %le_lo12_r(.LANCHOR0)
## hi20(a-4) = hi20(0x7fc) = 0. relaxable
## Test non-adjacent instructions.
lu12i.w $a0, %le_hi20_r(a-4)
addi $a1, $zero, 0x1
add $a0, $a0, $tp, %le_add_r(a-4)
addi $a1, $a1, 0x2
st $a1, $a0, %le_lo12_r(a-4)
## hi20(a) = hi20(0x800) = 1. not relaxable
lu12i.w $a0, %le_hi20_r(a)
add $a0, $a0, $tp, %le_add_r(a)
addi $a0, $a0, %le_lo12_r(a)
.section .tbss,"awT",@nobits
.space 8
.LANCHOR0:
.space 0x800-8
.globl a
a:
.zero 4