diff options
Diffstat (limited to 'test/ELF/ppc64-toc-addis-nop.s')
-rw-r--r-- | test/ELF/ppc64-toc-addis-nop.s | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/test/ELF/ppc64-toc-addis-nop.s b/test/ELF/ppc64-toc-addis-nop.s new file mode 100644 index 000000000000..a8c850ca2593 --- /dev/null +++ b/test/ELF/ppc64-toc-addis-nop.s @@ -0,0 +1,272 @@ +# REQUIRES: ppc + +# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t.o +# RUN: llvm-readelf -relocations --wide %t.o | FileCheck --check-prefix=InputRelocs %s + +# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %p/Inputs/shared-ppc64.s -o %t2.o +# RUN: ld.lld -shared %t2.o -o %t2.so +# +# RUN: ld.lld %t2.so %t.o -o %t +# RUN: llvm-objdump -D %t | FileCheck --check-prefix=Dis %s +# +# RUN: ld.lld --no-toc-optimize %t2.so %t.o -o %t +# RUN: llvm-objdump -D %t | FileCheck --check-prefix=NoOpt %s + +# InputRelocs: Relocation section '.rela.text' +# InputRelocs: R_PPC64_TOC16_HA +# InputRelocs: R_PPC64_TOC16_LO +# InputRelocs: R_PPC64_TOC16_LO_DS + + + .text + .abiversion 2 + + .global bytes + .p2align 4 + .type bytes,@function +bytes: +.Lbytes_gep: + addis 2, 12, .TOC.-.Lbytes_gep@ha + addi 2, 2, .TOC.-.Lbytes_gep@l +.Lbytes_lep: + .localentry bytes, .Lbytes_lep-.Lbytes_gep + addis 3, 2, byteLd@toc@ha + lbz 3, byteLd@toc@l(3) + addis 4, 2, byteSt@toc@ha + stb 3, byteSt@toc@l(4) + blr +# Dis-LABEL: bytes +# Dis-NEXT: addis +# Dis-NEXT: addi +# Dis-NEXT: nop +# Dis-NEXT: lbz 3, 32624(2) +# Dis-NEXT: nop +# Dis-NEXT: stb 3, 32625(2) +# Dis-NEXT: blr + +# NoOpt-LABEL: bytes +# NoOpt-NEXT: addis +# NoOpt-NEXT: addi +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: lbz 3, 32624(3) +# NoOpt-NEXT: addis 4, 2, 0 +# NoOpt-NEXT: stb 3, 32625(4) +# NoOpt-NEXT: blr + + .global halfs + .p2align 4 + .type halfs,@function +halfs: +.Lhalfs_gep: + addis 2, 12, .TOC.-.Lhalfs_gep@ha + addi 2, 2, .TOC.-.Lhalfs_gep@l +.Lhalfs_lep: + .localentry halfs, .Lhalfs_lep-.Lhalfs_gep + addis 3, 2, halfLd@toc@ha + lhz 3, halfLd@toc@l(3) + addis 4, 2, halfLd@toc@ha + lha 4, halfLd@toc@l(4) + addis 5, 2, halfSt@toc@ha + sth 4, halfSt@toc@l(5) + blr +# Dis-LABEL: halfs +# Dis-NEXT: addis +# Dis-NEXT: addi +# Dis-NEXT: nop +# Dis-NEXT: lhz 3, 32626(2) +# Dis-NEXT: nop +# Dis-NEXT: lha 4, 32626(2) +# Dis-NEXT: nop +# Dis-NEXT: sth 4, 32628(2) +# Dis-NEXT: blr + +# NoOpt-LABEL: halfs +# NoOpt-NEXT: addis +# NoOpt-NEXT: addi +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: lhz 3, 32626(3) +# NoOpt-NEXT: addis 4, 2, 0 +# NoOpt-NEXT: lha 4, 32626(4) +# NoOpt-NEXT: addis 5, 2, 0 +# NoOpt-NEXT: sth 4, 32628(5) +# NoOpt-NEXT: blr + + + .global words + .p2align 4 + .type words,@function +words: +.Lwords_gep: + addis 2, 12, .TOC.-.Lwords_gep@ha + addi 2, 2, .TOC.-.Lwords_gep@l +.Lwords_lep: + .localentry words, .Lwords_lep-.Lwords_gep + addis 3, 2, wordLd@toc@ha + lwz 3, wordLd@toc@l(3) + addis 4, 2, wordLd@toc@ha + lwa 4, wordLd@toc@l(4) + addis 5, 2, wordSt@toc@ha + stw 4, wordSt@toc@l(5) + blr +# Dis-LABEL: words +# Dis-NEXT: addis +# Dis-NEXT: addi +# Dis-NEXT: nop +# Dis-NEXT: lwz 3, 32632(2) +# Dis-NEXT: nop +# Dis-NEXT: lwa 4, 32632(2) +# Dis-NEXT: nop +# Dis-NEXT: stw 4, 32636(2) +# Dis-NEXT: blr + +# NoOpt-LABEL: words +# NoOpt-NEXT: addis +# NoOpt-NEXT: addi +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: lwz 3, 32632(3) +# NoOpt-NEXT: addis 4, 2, 0 +# NoOpt-NEXT: lwa 4, 32632(4) +# NoOpt-NEXT: addis 5, 2, 0 +# NoOpt-NEXT: stw 4, 32636(5) +# NoOpt-NEXT: blr + + .global doublewords + .p2align 4 + .type doublewords,@function +doublewords: +.Ldoublewords_gep: + addis 2, 12, .TOC.-.Ldoublewords_gep@ha + addi 2, 2, .TOC.-.Ldoublewords_gep@l +.Ldoublewords_lep: + .localentry doublewords, .Ldoublewords_lep-.Ldoublewords_gep + addis 3, 2, dwordLd@toc@ha + ld 3, dwordLd@toc@l(3) + addis 4, 2, dwordSt@toc@ha + std 3, dwordSt@toc@l(4) + blr + +# Dis-LABEL: doublewords +# Dis-NEXT: addis +# Dis-NEXT: addi +# Dis-NEXT: nop +# Dis-NEXT: ld 3, 32640(2) +# Dis-NEXT: nop +# Dis-NEXT: std 3, 32648(2) +# Dis-NEXT: blr + +# NoOpt-LABEL: doublewords +# NoOpt-NEXT: addis +# NoOpt-NEXT: addi +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: ld 3, 32640(3) +# NoOpt-NEXT: addis 4, 2, 0 +# NoOpt-NEXT: std 3, 32648(4) +# NoOpt-NEXT: blr + + .global vec_dq + .p2align 4 + .type vec_dq,@function +vec_dq: +.Lvec_dq_gep: + addis 2, 12, .TOC.-.Lvec_dq_gep@ha + addi 2, 2, .TOC.-.Lvec_dq_gep@l +.Lvec_dq_lep: + .localentry vec_dq, .Lvec_dq_lep-.Lvec_dq_gep + addis 3, 2, vecLd@toc@ha + lxv 3, vecLd@toc@l(3) + addis 3, 2, vecSt@toc@ha + stxv 3, vecSt@toc@l(3) + blr + +# Dis-LABEL: vec_dq +# Dis-NEXT: addis +# Dis-NEXT: addi +# Dis-NEXT: nop +# Dis-NEXT: lxv 3, 32656(2) +# Dis-NEXT: nop +# Dis-NEXT: stxv 3, 32672(2) +# Dis-NEXT: blr + +# NoOpt-LABEL: vec_dq +# NoOpt-NEXT: addis +# NoOpt-NEXT: addi +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: lxv 3, 32656(3) +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: stxv 3, 32672(3) +# NoOpt-NEXT: blr + + .global vec_ds + .p2align 4 + .type vec_ds,@function +vec_ds: +.Lvec_ds_gep: + addis 2, 12, .TOC.-.Lvec_ds_gep@ha + addi 2, 2, .TOC.-.Lvec_ds_gep@l +.Lvec_ds_lep: + .localentry vec_ds, .Lvec_dq_lep-.Lvec_dq_gep + addis 3, 2, vecLd@toc@ha + lxsd 3, vecLd@toc@l(3) + addis 3, 2, vecSt@toc@ha + stxsd 3, vecSt@toc@l(3) + addis 3, 2, vecLd@toc@ha + lxssp 3, vecLd@toc@l(3) + addis 3, 2, vecSt@toc@ha + stxssp 3, vecSt@toc@l(3) + blr +# Dis-LABEL: vec_ds +# Dis-NEXT: addis +# Dis-NEXT: addi +# Dis-NEXT: nop +# Dis-NEXT: lxsd 3, 32656(2) +# Dis-NEXT: nop +# Dis-NEXT: stxsd 3, 32672(2) +# Dis-NEXT: nop +# Dis-NEXT: lxssp 3, 32656(2) +# Dis-NEXT: nop +# Dis-NEXT: stxssp 3, 32672(2) +# Dis-NEXT: blr + +# NoOpt-LABEL: vec_ds +# NoOpt-NEXT: addis +# NoOpt-NEXT: addi +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: lxsd 3, 32656(3) +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: stxsd 3, 32672(3) +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: lxssp 3, 32656(3) +# NoOpt-NEXT: addis 3, 2, 0 +# NoOpt-NEXT: stxssp 3, 32672(3) +# NoOpt-NEXT: blr + + + .global byteLd + .lcomm byteLd, 1, 1 + + .global byteSt + .lcomm byteSt, 1, 1 + + .global halfLd + .lcomm halfLd, 2, 2 + + .global halfSt + .lcomm halfSt, 2, 2 + + .global wordLd + .lcomm wordLd, 4, 4 + + .global wordSt + .lcomm wordSt, 4, 4 + + .global dwordLd + .lcomm dwordLd, 8, 8 + + .global dwordSt + .lcomm dwordSt, 8, 8 + + .global vecLd + .lcomm vecLd, 16, 16 + + .global vecSt + .lcomm vecSt, 16, 16 |