forked from OSchip/llvm-project
393 lines
11 KiB
ArmAsm
393 lines
11 KiB
ArmAsm
# REQUIRES: ppc
|
|
# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s -o %t1.o
|
|
# RUN: llvm-mc -filetype=obj -triple=powerpc64le %p/Inputs/ppc64-got-to-pcrel-relaxation-def.s -o %t2.o
|
|
# RUN: ld.lld --shared %t2.o -o %t2.so --soname=t2
|
|
# RUN: ld.lld %t1.o %t2.o -o %t
|
|
# RUN: ld.lld %t1.o %t2.so -o %ts
|
|
# RUN: ld.lld %t1.o %t2.o -o %tn --no-pcrel-optimize
|
|
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t | FileCheck %s --check-prefix=CHECK-S
|
|
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %ts | FileCheck %s --check-prefix=CHECK-D
|
|
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %tn | FileCheck %s --check-prefix=CHECK-D
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=powerpc64 %s -o %t1.o
|
|
# RUN: llvm-mc -filetype=obj -triple=powerpc64 %p/Inputs/ppc64-got-to-pcrel-relaxation-def.s -o %t2.o
|
|
# RUN: ld.lld --shared %t2.o -o %t2.so --soname=t2
|
|
# RUN: ld.lld %t1.o %t2.o -o %t
|
|
# RUN: ld.lld %t1.o %t2.so -o %ts
|
|
# RUN: ld.lld %t1.o %t2.o -o %tn --no-pcrel-optimize
|
|
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t | FileCheck %s --check-prefix=CHECK-S
|
|
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %ts | FileCheck %s --check-prefix=CHECK-D
|
|
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %tn | FileCheck %s --check-prefix=CHECK-D
|
|
|
|
# CHECK-S-LABEL: <check_LBZ_STB>:
|
|
# CHECK-S-NEXT: plbz 10
|
|
# CHECK-S-NEXT: paddi 9
|
|
# CHECK-S-NEXT: li 3, 0
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: rldicl 9, 9, 9, 60
|
|
# CHECK-S-NEXT: add 9, 9, 10
|
|
# CHECK-S-NEXT: pstb 9
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LBZ_STB>:
|
|
# CHECK-D-NEXT: pld 8
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: li 3, 0
|
|
# CHECK-D-NEXT: lbz 10, 0(8)
|
|
# CHECK-D-NEXT: rldicl 9, 9, 9, 60
|
|
# CHECK-D-NEXT: add 9, 9, 10
|
|
# CHECK-D-NEXT: pld 10
|
|
# CHECK-D-NEXT: stb 9, 0(10)
|
|
# CHECK-D-NEXT: blr
|
|
check_LBZ_STB:
|
|
pld 8,useVal@got@pcrel(0),1
|
|
.Lpcrel1:
|
|
pld 9,useAddr@got@pcrel(0),1
|
|
li 3,0
|
|
.reloc .Lpcrel1-8,R_PPC64_PCREL_OPT,.-(.Lpcrel1-8)
|
|
lbz 10,0(8)
|
|
rldicl 9,9,9,60
|
|
add 9,9,10
|
|
pld 10,storeVal@got@pcrel(0),1
|
|
.Lpcrel2:
|
|
.reloc .Lpcrel2-8,R_PPC64_PCREL_OPT,.-(.Lpcrel2-8)
|
|
stb 9,0(10)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LHZ_STH>:
|
|
# CHECK-S-NEXT: plhz 3
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: psth 3
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LHZ_STH>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: lhz 3, 0(9)
|
|
# CHECK-D-NEXT: nop
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: sth 3, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LHZ_STH:
|
|
pld 9,useVal_ushort@got@pcrel(0),1
|
|
.Lpcrel3:
|
|
.reloc .Lpcrel3-8,R_PPC64_PCREL_OPT,.-(.Lpcrel3-8)
|
|
lhz 3,0(9)
|
|
pld 9,storeVal_ushort@got@pcrel(0),1
|
|
.Lpcrel4:
|
|
.reloc .Lpcrel4-8,R_PPC64_PCREL_OPT,.-(.Lpcrel4-8)
|
|
sth 3,0(9)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LWZ_STW>:
|
|
# CHECK-S-NEXT: plwz 3
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: pstw 3
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LWZ_STW>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: lwz 3, 0(9)
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: stw 3, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LWZ_STW:
|
|
pld 9,useVal_uint@got@pcrel(0),1
|
|
.Lpcrel5:
|
|
.reloc .Lpcrel5-8,R_PPC64_PCREL_OPT,.-(.Lpcrel5-8)
|
|
lwz 3,0(9)
|
|
pld 9,storeVal_uint@got@pcrel(0),1
|
|
.Lpcrel6:
|
|
.reloc .Lpcrel6-8,R_PPC64_PCREL_OPT,.-(.Lpcrel6-8)
|
|
stw 3,0(9)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LFS_STFS>:
|
|
# CHECK-S-NEXT: plfs 1
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: pstfs 1
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LFS_STFS>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: lfs 1, 0(9)
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: stfs 1, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LFS_STFS:
|
|
pld 9,useVal_float@got@pcrel(0),1
|
|
.Lpcrel7:
|
|
.reloc .Lpcrel7-8,R_PPC64_PCREL_OPT,.-(.Lpcrel7-8)
|
|
lfs 1,0(9)
|
|
pld 9,storeVal_float@got@pcrel(0),1
|
|
.Lpcrel8:
|
|
.reloc .Lpcrel8-8,R_PPC64_PCREL_OPT,.-(.Lpcrel8-8)
|
|
stfs 1,0(9)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LFD_STFD>:
|
|
# CHECK-S-NEXT: plfd 1
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: pstfd 1
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LFD_STFD>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: lfd 1, 0(9)
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: stfd 1, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LFD_STFD:
|
|
pld 9,useVal_double@got@pcrel(0),1
|
|
.Lpcrel9:
|
|
.reloc .Lpcrel9-8,R_PPC64_PCREL_OPT,.-(.Lpcrel9-8)
|
|
lfd 1,0(9)
|
|
pld 9,storeVal_double@got@pcrel(0),1
|
|
.Lpcrel10:
|
|
.reloc .Lpcrel10-8,R_PPC64_PCREL_OPT,.-(.Lpcrel10-8)
|
|
stfd 1,0(9)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LWA_STW>:
|
|
# CHECK-S-NEXT: mr 9, 3
|
|
# CHECK-S-NEXT: plwa 3
|
|
# CHECK-S-NEXT: pstw 9
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LWA_STW>:
|
|
# CHECK-D-NEXT: mr 9, 3
|
|
# CHECK-D-NEXT: pld 8
|
|
# CHECK-D-NEXT: pld 10
|
|
# CHECK-D-NEXT: lwa 3, 0(8)
|
|
# CHECK-D-NEXT: stw 9, 0(10)
|
|
# CHECK-D-NEXT: blr
|
|
check_LWA_STW:
|
|
mr 9,3
|
|
pld 8,useVal_sint@got@pcrel(0),1
|
|
.Lpcrel11:
|
|
pld 10,storeVal_sint@got@pcrel(0),1
|
|
.Lpcrel12:
|
|
.reloc .Lpcrel11-8,R_PPC64_PCREL_OPT,.-(.Lpcrel11-8)
|
|
lwa 3,0(8)
|
|
.reloc .Lpcrel12-8,R_PPC64_PCREL_OPT,.-(.Lpcrel12-8)
|
|
stw 9,0(10)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LHA_STH>:
|
|
# CHECK-S-NEXT: mr 9, 3
|
|
# CHECK-S-NEXT: plha 3
|
|
# CHECK-S-NEXT: psth 9
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LHA_STH>:
|
|
# CHECK-D-NEXT: mr 9, 3
|
|
# CHECK-D-NEXT: pld 8
|
|
# CHECK-D-NEXT: pld 10
|
|
# CHECK-D-NEXT: lha 3, 0(8)
|
|
# CHECK-D-NEXT: sth 9, 0(10)
|
|
# CHECK-D-NEXT: blr
|
|
check_LHA_STH:
|
|
mr 9,3
|
|
pld 8,useVal_sshort@got@pcrel(0),1
|
|
.Lpcrel13:
|
|
pld 10,storeVal_sshort@got@pcrel(0),1
|
|
.Lpcrel14:
|
|
.reloc .Lpcrel13-8,R_PPC64_PCREL_OPT,.-(.Lpcrel13-8)
|
|
lha 3,0(8)
|
|
.reloc .Lpcrel14-8,R_PPC64_PCREL_OPT,.-(.Lpcrel14-8)
|
|
sth 9,0(10)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LD_STD>:
|
|
# CHECK-S-NEXT: pld 3
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: pstd 3
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LD_STD>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: ld 3, 0(9)
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: std 3, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LD_STD:
|
|
pld 9,useVal_longlong@got@pcrel(0),1
|
|
.Lpcrel15:
|
|
.reloc .Lpcrel15-8,R_PPC64_PCREL_OPT,.-(.Lpcrel15-8)
|
|
ld 3,0(9)
|
|
pld 9,storeVal_longlong@got@pcrel(0),1
|
|
.Lpcrel16:
|
|
.reloc .Lpcrel16-8,R_PPC64_PCREL_OPT,.-(.Lpcrel16-8)
|
|
std 3,0(9)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LXV_STXV>:
|
|
# CHECK-S-NEXT: plxv 34
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: pstxv 34
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LXV_STXV>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: lxv 34, 0(9)
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: stxv 34, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LXV_STXV:
|
|
pld 9,useVal_vector@got@pcrel(0),1
|
|
.Lpcrel17:
|
|
.reloc .Lpcrel17-8,R_PPC64_PCREL_OPT,.-(.Lpcrel17-8)
|
|
lxv 34,0(9)
|
|
pld 9,storeVal_vector@got@pcrel(0),1
|
|
.Lpcrel18:
|
|
.reloc .Lpcrel18-8,R_PPC64_PCREL_OPT,.-(.Lpcrel18-8)
|
|
stxv 34,0(9)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LXSSP_STXSSP>:
|
|
# CHECK-S-NEXT: plxssp 1
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: pstxssp 1
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LXSSP_STXSSP>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: lxssp 1, 0(9)
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: stxssp 1, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LXSSP_STXSSP:
|
|
pld 9,useVal_float@got@pcrel(0),1
|
|
.Lpcrel19:
|
|
.reloc .Lpcrel19-8,R_PPC64_PCREL_OPT,.-(.Lpcrel19-8)
|
|
lxssp 1,0(9)
|
|
pld 9,storeVal_float@got@pcrel(0),1
|
|
.Lpcrel20:
|
|
.reloc .Lpcrel20-8,R_PPC64_PCREL_OPT,.-(.Lpcrel20-8)
|
|
stxssp 1,0(9)
|
|
blr
|
|
|
|
# CHECK-S-LABEL: <check_LXSD_STXSD>:
|
|
# CHECK-S-NEXT: plxsd 1, [[#ADDR1:]]
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: pstxsd 1, [[#ADDR2:]]
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LXSD_STXSD>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: lxsd 1, 0(9)
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: stxsd 1, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LXSD_STXSD:
|
|
pld 9,useVal_double@got@pcrel(0),1
|
|
.Lpcrel21:
|
|
.reloc .Lpcrel21-8,R_PPC64_PCREL_OPT,.-(.Lpcrel21-8)
|
|
lxsd 1,0(9)
|
|
pld 9,storeVal_double@got@pcrel(0),1
|
|
.Lpcrel22:
|
|
.reloc .Lpcrel22-8,R_PPC64_PCREL_OPT,.-(.Lpcrel22-8)
|
|
stxsd 1,0(9)
|
|
blr
|
|
|
|
# The respective displacements are computed relative to the PC which advanced
|
|
# by 28 bytes in this function. Since the displacements in the two access
|
|
# instructions are 8 and 32 so the displacements are those computed above minus
|
|
# 20 and plus 4 (+8 - 28 and +32 - 28) respectively.
|
|
# CHECK-S-LABEL: <check_LXSD_STXSD_aggr>:
|
|
# CHECK-S-NEXT: plxsd 1, [[#ADDR1-20]]
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: pstxsd 1, [[#ADDR2+4]]
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LXSD_STXSD_aggr>:
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: lxsd 1, 8(9)
|
|
# CHECK-D-NEXT: pld 9
|
|
# CHECK-D-NEXT: stxsd 1, 32(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LXSD_STXSD_aggr:
|
|
pld 9,useVal_double@got@pcrel(0),1
|
|
.Lpcrel23:
|
|
.reloc .Lpcrel23-8,R_PPC64_PCREL_OPT,.-(.Lpcrel23-8)
|
|
lxsd 1,8(9)
|
|
pld 9,storeVal_double@got@pcrel(0),1
|
|
.Lpcrel24:
|
|
.reloc .Lpcrel24-8,R_PPC64_PCREL_OPT,.-(.Lpcrel24-8)
|
|
stxsd 1,32(9)
|
|
blr
|
|
|
|
# This includes a nop but that is not emitted by the linker.
|
|
# It is an alignment nop to prevent the prefixed instruction from
|
|
# crossing a 64-byte boundary.
|
|
# CHECK-S-LABEL: <check_LD_STD_W_PADDI>:
|
|
# CHECK-S-NEXT: paddi 9
|
|
# CHECK-S-NEXT: ld 3, 0(9)
|
|
# CHECK-S-NEXT: nop
|
|
# CHECK-S-NEXT: paddi 9
|
|
# CHECK-S-NEXT: std 3, 0(9)
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LD_STD_W_PADDI>:
|
|
# CHECK-D-NEXT: paddi 9
|
|
# CHECK-D-NEXT: ld 3, 0(9)
|
|
# CHECK-D-NEXT: nop
|
|
# CHECK-D-NEXT: paddi 9
|
|
# CHECK-D-NEXT: std 3, 0(9)
|
|
# CHECK-D-NEXT: blr
|
|
check_LD_STD_W_PADDI:
|
|
paddi 9,0,useVal_longlong@got@pcrel,1
|
|
.Lpcrel25:
|
|
.reloc .Lpcrel25-8,R_PPC64_PCREL_OPT,.-(.Lpcrel25-8)
|
|
ld 3,0(9)
|
|
paddi 9,0,storeVal_longlong@got@pcrel,1
|
|
.Lpcrel26:
|
|
.reloc .Lpcrel26-8,R_PPC64_PCREL_OPT,.-(.Lpcrel26-8)
|
|
std 3,0(9)
|
|
blr
|
|
# CHECK-S-LABEL: <check_LXSD_STXSD_aggr_notoc>:
|
|
# CHECK-S-NEXT: paddi 3, 0, -12, 1
|
|
# CHECK-S-NEXT: lwz 4, 8(3)
|
|
# CHECK-S-NEXT: paddi 3, 0, -24, 1
|
|
# CHECK-S-NEXT: stw 4, 32(3)
|
|
# CHECK-S-NEXT: blr
|
|
|
|
# CHECK-D-LABEL: <check_LXSD_STXSD_aggr_notoc>:
|
|
# CHECK-D-NEXT: paddi 3, 0, -12, 1
|
|
# CHECK-D-NEXT: lwz 4, 8(3)
|
|
# CHECK-D-NEXT: paddi 3, 0, -24, 1
|
|
# CHECK-D-NEXT: stw 4, 32(3)
|
|
# CHECK-D-NEXT: blr
|
|
.type Arr,@object # @Arr
|
|
.globl Arr
|
|
.p2align 2
|
|
Arr:
|
|
.long 11 # 0xb
|
|
.long 22 # 0x16
|
|
.long 33 # 0x21
|
|
check_LXSD_STXSD_aggr_notoc:
|
|
paddi 3, 0, Arr@PCREL, 1
|
|
.Lpcrel27:
|
|
.reloc .Lpcrel27-8,R_PPC64_PCREL_OPT,.-(.Lpcrel27-8)
|
|
lwz 4,8(3)
|
|
paddi 3, 0, Arr@PCREL, 1
|
|
.Lpcrel28:
|
|
.reloc .Lpcrel28-8,R_PPC64_PCREL_OPT,.-(.Lpcrel28-8)
|
|
stw 4,32(3)
|
|
blr
|
|
|