| # 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 |
| |