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