1# REQUIRES: ppc 2 3# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t.o 4# RUN: llvm-readelf -r %t.o | FileCheck --check-prefix=InputRelocs %s 5 6# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %p/Inputs/shared-ppc64.s -o %t2.o 7# RUN: ld.lld -shared -soname=t2.so %t2.o -o %t2.so 8 9## Place all sections in the same segment so that .text and .TOC. are on the same page. 10# RUN: echo 'PHDRS { all PT_LOAD; }' > %t.script 11# 12# RUN: ld.lld %t2.so %t.o -T %t.script -o %t 13# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=Dis %s 14# 15# RUN: ld.lld %t2.so %t.o -T %t.script --no-toc-optimize -o %t 16# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=NoOpt %s 17 18# InputRelocs: Relocation section '.rela.text' 19# InputRelocs: R_PPC64_TOC16_HA 20# InputRelocs: R_PPC64_TOC16_LO 21# InputRelocs: R_PPC64_TOC16_LO_DS 22 23 24 .text 25 .abiversion 2 26 27 .global bytes 28 .p2align 4 29 .type bytes,@function 30bytes: 31.Lbytes_gep: 32 addis 2, 12, .TOC.-.Lbytes_gep@ha 33 addi 2, 2, .TOC.-.Lbytes_gep@l 34.Lbytes_lep: 35 .localentry bytes, .Lbytes_lep-.Lbytes_gep 36 addis 3, 2, byteLd@toc@ha 37 lbz 3, byteLd@toc@l(3) 38 addis 4, 2, byteSt@toc@ha 39 stb 3, byteSt@toc@l(4) 40 blr 41# Dis-LABEL: <bytes>: 42# Dis-NEXT: addis 43# Dis-NEXT: addi 44# Dis-NEXT: nop 45# Dis-NEXT: lbz 3, -32752(2) 46# Dis-NEXT: nop 47# Dis-NEXT: stb 3, -32751(2) 48# Dis-NEXT: blr 49 50# NoOpt-LABEL: <bytes>: 51# NoOpt-NEXT: addis 52# NoOpt-NEXT: addi 53# NoOpt-NEXT: addis 3, 2, 0 54# NoOpt-NEXT: lbz 3, -32752(3) 55# NoOpt-NEXT: addis 4, 2, 0 56# NoOpt-NEXT: stb 3, -32751(4) 57# NoOpt-NEXT: blr 58 59 .global halfs 60 .p2align 4 61 .type halfs,@function 62halfs: 63.Lhalfs_gep: 64 addis 2, 12, .TOC.-.Lhalfs_gep@ha 65 addi 2, 2, .TOC.-.Lhalfs_gep@l 66.Lhalfs_lep: 67 .localentry halfs, .Lhalfs_lep-.Lhalfs_gep 68 addis 3, 2, halfLd@toc@ha 69 lhz 3, halfLd@toc@l(3) 70 addis 4, 2, halfLd@toc@ha 71 lha 4, halfLd@toc@l(4) 72 addis 5, 2, halfSt@toc@ha 73 sth 4, halfSt@toc@l(5) 74 blr 75# Dis-LABEL: <halfs>: 76# Dis-NEXT: addis 77# Dis-NEXT: addi 78# Dis-NEXT: nop 79# Dis-NEXT: lhz 3, -32750(2) 80# Dis-NEXT: nop 81# Dis-NEXT: lha 4, -32750(2) 82# Dis-NEXT: nop 83# Dis-NEXT: sth 4, -32748(2) 84# Dis-NEXT: blr 85 86# NoOpt-LABEL: <halfs>: 87# NoOpt-NEXT: addis 88# NoOpt-NEXT: addi 89# NoOpt-NEXT: addis 3, 2, 0 90# NoOpt-NEXT: lhz 3, -32750(3) 91# NoOpt-NEXT: addis 4, 2, 0 92# NoOpt-NEXT: lha 4, -32750(4) 93# NoOpt-NEXT: addis 5, 2, 0 94# NoOpt-NEXT: sth 4, -32748(5) 95# NoOpt-NEXT: blr 96 97 98 .global words 99 .p2align 4 100 .type words,@function 101words: 102.Lwords_gep: 103 addis 2, 12, .TOC.-.Lwords_gep@ha 104 addi 2, 2, .TOC.-.Lwords_gep@l 105.Lwords_lep: 106 .localentry words, .Lwords_lep-.Lwords_gep 107 addis 3, 2, wordLd@toc@ha 108 lwz 3, wordLd@toc@l(3) 109 addis 4, 2, wordLd@toc@ha 110 lwa 4, wordLd@toc@l(4) 111 addis 5, 2, wordSt@toc@ha 112 stw 4, wordSt@toc@l(5) 113 blr 114# Dis-LABEL: words 115# Dis-NEXT: addis 116# Dis-NEXT: addi 117# Dis-NEXT: nop 118# Dis-NEXT: lwz 3, -32744(2) 119# Dis-NEXT: nop 120# Dis-NEXT: lwa 4, -32744(2) 121# Dis-NEXT: nop 122# Dis-NEXT: stw 4, -32740(2) 123# Dis-NEXT: blr 124 125# NoOpt-LABEL: words 126# NoOpt-NEXT: addis 127# NoOpt-NEXT: addi 128# NoOpt-NEXT: addis 3, 2, 0 129# NoOpt-NEXT: lwz 3, -32744(3) 130# NoOpt-NEXT: addis 4, 2, 0 131# NoOpt-NEXT: lwa 4, -32744(4) 132# NoOpt-NEXT: addis 5, 2, 0 133# NoOpt-NEXT: stw 4, -32740(5) 134# NoOpt-NEXT: blr 135 136 .global doublewords 137 .p2align 4 138 .type doublewords,@function 139doublewords: 140.Ldoublewords_gep: 141 addis 2, 12, .TOC.-.Ldoublewords_gep@ha 142 addi 2, 2, .TOC.-.Ldoublewords_gep@l 143.Ldoublewords_lep: 144 .localentry doublewords, .Ldoublewords_lep-.Ldoublewords_gep 145 addis 3, 2, dwordLd@toc@ha 146 ld 3, dwordLd@toc@l(3) 147 addis 4, 2, dwordSt@toc@ha 148 std 3, dwordSt@toc@l(4) 149 blr 150 151# Dis-LABEL: doublewords 152# Dis-NEXT: addis 153# Dis-NEXT: addi 154# Dis-NEXT: nop 155# Dis-NEXT: ld 3, -32736(2) 156# Dis-NEXT: nop 157# Dis-NEXT: std 3, -32728(2) 158# Dis-NEXT: blr 159 160# NoOpt-LABEL: doublewords 161# NoOpt-NEXT: addis 162# NoOpt-NEXT: addi 163# NoOpt-NEXT: addis 3, 2, 0 164# NoOpt-NEXT: ld 3, -32736(3) 165# NoOpt-NEXT: addis 4, 2, 0 166# NoOpt-NEXT: std 3, -32728(4) 167# NoOpt-NEXT: blr 168 169 .global vec_dq 170 .p2align 4 171 .type vec_dq,@function 172vec_dq: 173.Lvec_dq_gep: 174 addis 2, 12, .TOC.-.Lvec_dq_gep@ha 175 addi 2, 2, .TOC.-.Lvec_dq_gep@l 176.Lvec_dq_lep: 177 .localentry vec_dq, .Lvec_dq_lep-.Lvec_dq_gep 178 addis 3, 2, vecLd@toc@ha 179 lxv 3, vecLd@toc@l(3) 180 addis 3, 2, vecSt@toc@ha 181 stxv 3, vecSt@toc@l(3) 182 blr 183 184# Dis-LABEL: <vec_dq>: 185# Dis-NEXT: addis 186# Dis-NEXT: addi 187# Dis-NEXT: nop 188# Dis-NEXT: lxv 3, -32720(2) 189# Dis-NEXT: nop 190# Dis-NEXT: stxv 3, -32704(2) 191# Dis-NEXT: blr 192 193# NoOpt-LABEL: <vec_dq>: 194# NoOpt-NEXT: addis 195# NoOpt-NEXT: addi 196# NoOpt-NEXT: addis 3, 2, 0 197# NoOpt-NEXT: lxv 3, -32720(3) 198# NoOpt-NEXT: addis 3, 2, 0 199# NoOpt-NEXT: stxv 3, -32704(3) 200# NoOpt-NEXT: blr 201 202 .global vec_ds 203 .p2align 4 204 .type vec_ds,@function 205vec_ds: 206.Lvec_ds_gep: 207 addis 2, 12, .TOC.-.Lvec_ds_gep@ha 208 addi 2, 2, .TOC.-.Lvec_ds_gep@l 209.Lvec_ds_lep: 210 .localentry vec_ds, .Lvec_dq_lep-.Lvec_dq_gep 211 addis 3, 2, vecLd@toc@ha 212 lxsd 3, vecLd@toc@l(3) 213 addis 3, 2, vecSt@toc@ha 214 stxsd 3, vecSt@toc@l(3) 215 addis 3, 2, vecLd@toc@ha 216 lxssp 3, vecLd@toc@l(3) 217 addis 3, 2, vecSt@toc@ha 218 stxssp 3, vecSt@toc@l(3) 219 blr 220# Dis-LABEL: <vec_ds>: 221# Dis-NEXT: addis 222# Dis-NEXT: addi 223# Dis-NEXT: nop 224# Dis-NEXT: lxsd 3, -32720(2) 225# Dis-NEXT: nop 226# Dis-NEXT: stxsd 3, -32704(2) 227# Dis-NEXT: nop 228# Dis-NEXT: lxssp 3, -32720(2) 229# Dis-NEXT: nop 230# Dis-NEXT: stxssp 3, -32704(2) 231# Dis-NEXT: blr 232 233# NoOpt-LABEL: <vec_ds>: 234# NoOpt-NEXT: addis 235# NoOpt-NEXT: addi 236# NoOpt-NEXT: addis 3, 2, 0 237# NoOpt-NEXT: lxsd 3, -32720(3) 238# NoOpt-NEXT: addis 3, 2, 0 239# NoOpt-NEXT: stxsd 3, -32704(3) 240# NoOpt-NEXT: addis 3, 2, 0 241# NoOpt-NEXT: lxssp 3, -32720(3) 242# NoOpt-NEXT: addis 3, 2, 0 243# NoOpt-NEXT: stxssp 3, -32704(3) 244# NoOpt-NEXT: blr 245 246 247 .global byteLd 248 .lcomm byteLd, 1, 1 249 250 .global byteSt 251 .lcomm byteSt, 1, 1 252 253 .global halfLd 254 .lcomm halfLd, 2, 2 255 256 .global halfSt 257 .lcomm halfSt, 2, 2 258 259 .global wordLd 260 .lcomm wordLd, 4, 4 261 262 .global wordSt 263 .lcomm wordSt, 4, 4 264 265 .global dwordLd 266 .lcomm dwordLd, 8, 8 267 268 .global dwordSt 269 .lcomm dwordSt, 8, 8 270 271 .global vecLd 272 .lcomm vecLd, 16, 16 273 274 .global vecSt 275 .lcomm vecSt, 16, 16 276