1# RUN: llvm-mc -triple=powerpc64le -filetype=obj %s | \ 2# RUN: llvm-objdump -dr --mcpu=pwr10 - | FileCheck %s 3# RUN: llvm-mc -triple=powerpc64 -filetype=obj %s | \ 4# RUN: llvm-objdump -dr --mcpu=pwr10 - | FileCheck %s 5 6 7## 8# This section of tests contains the MCBinaryExpr as the first parameter of the 9# .reloc relocation. 10## 11 .text 12 .abiversion 2 13 .globl Minimal 14 .p2align 4 15 .type Minimal,@function 16Minimal: 17.LMinimal$local: 18 pld 3, vec@got@pcrel(0), 1 19.Lpcrel1: 20 .reloc .Lpcrel1-8,R_PPC64_PCREL_OPT,.-(.Lpcrel1-8) 21 lwa 3, 4(3) 22 blr 23 .long 0 24 .quad 0 25# CHECK-LABEL: Minimal 26# CHECK: pld 3, 0(0), 1 27# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 28# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8 29# CHECK-NEXT: lwa 3, 4(3) 30# CHECK-NEXT: blr 31 32 .globl SingleInsnBetween 33 .p2align 4 34 .type SingleInsnBetween,@function 35SingleInsnBetween: 36.LSingleInsnBetween$local: 37 pld 3, vec@got@pcrel(0), 1 38.Lpcrel2: 39 addi 3, 3, 42 40 .reloc .Lpcrel2-8,R_PPC64_PCREL_OPT,.-(.Lpcrel2-8) 41 lwa 3, 4(3) 42 blr 43 .long 0 44 .quad 0 45# CHECK_LABEL: SingleInsnBetween 46# CHECK: pld 3, 0(0), 1 47# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 48# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0xc 49# CHECK-NEXT: addi 3, 3, 42 50# CHECK-NEXT: lwa 3, 4(3) 51# CHECK-NEXT: blr 52 53 54 .globl MultiInsnBetween # -- Begin function 55 .p2align 4 56 .type MultiInsnBetween,@function 57MultiInsnBetween: 58.LMultiInsnBetween$local: 59 pld 3, vec@got@pcrel(0), 1 60.Lpcrel3: 61 addi 3, 3, 42 62 addi 3, 3, 42 63 addi 3, 3, 42 64 addi 3, 3, 42 65 addi 3, 3, 42 66 .reloc .Lpcrel3-8,R_PPC64_PCREL_OPT,.-(.Lpcrel3-8) 67 lwa 3, 4(3) 68 blr 69 .long 0 70 .quad 0 71# CHECK_LABEL: MultiInsnBetween 72# CHECK: pld 3, 0(0), 1 73# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 74# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x1c 75# CHECK-NEXT: addi 3, 3, 42 76# CHECK-NEXT: addi 3, 3, 42 77# CHECK-NEXT: addi 3, 3, 42 78# CHECK-NEXT: addi 3, 3, 42 79# CHECK-NEXT: addi 3, 3, 42 80# CHECK-NEXT: lwa 3, 4(3) 81# CHECK-NEXT: blr 82 83 .globl PrefixInsnBetween 84 .p2align 6 85 .type PrefixInsnBetween,@function 86 .space 48 # Add a space to force an alignment of a paddi. 87PrefixInsnBetween: 88.LPrefixInsnBetween$local: 89 pld 3, vec@got@pcrel(0), 1 90.Lpcrel4: 91 addi 3, 3, 42 92 paddi 3, 3, 42, 0 93 addi 3, 3, 42 94 paddi 3, 3, 42, 0 95 addi 3, 3, 42 96 .reloc .Lpcrel4-8,R_PPC64_PCREL_OPT,.-(.Lpcrel4-8) 97 lwa 3, 4(3) 98 blr 99 .long 0 100 .quad 0 101# CHECK_LABEL: PrefixInsnBetween 102# CHECK: pld 3, 0(0), 1 103# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 104# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x28 105# CHECK-NEXT: addi 3, 3, 42 106# CHECK-NEXT: nop 107# CHECK-NEXT: paddi 3, 3, 42, 0 108# CHECK-NEXT: addi 3, 3, 42 109# CHECK-NEXT: paddi 3, 3, 42, 0 110# CHECK-NEXT: addi 3, 3, 42 111# CHECK-NEXT: lwa 3, 4(3) 112# CHECK-NEXT: blr 113 114 115 .globl SpaceBetween # -- Begin function 116 .p2align 4 117 .type SpaceBetween,@function 118SpaceBetween: 119.LSpaceBetween$local: 120 pld 3, vec@got@pcrel(0), 1 121.Lpcrel5: 122 addi 3, 3, 42 123 paddi 3, 3, 42, 0 124 addi 3, 3, 42 125 .space 40, 0 126 paddi 3, 3, 42, 0 127 addi 3, 3, 42 128 .reloc .Lpcrel5-8,R_PPC64_PCREL_OPT,.-(.Lpcrel5-8) 129 lwa 3, 4(3) 130 blr 131 .long 0 132 .quad 0 133# CHECK_LABEL: SpaceBetween 134# CHECK: pld 3, 0(0), 1 135# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 136# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x50 137# CHECK-NEXT: addi 3, 3, 42 138# CHECK-NEXT: nop 139# CHECK-NEXT: paddi 3, 3, 42, 0 140# CHECK-NEXT: addi 3, 3, 42 141# CHECK: paddi 3, 3, 42, 0 142# CHECK-NEXT: addi 3, 3, 42 143# CHECK-NEXT: lwa 3, 4(3) 144# CHECK-NEXT: blr 145 146 147 .globl Plus 148 .p2align 4 149 .type Plus,@function 150Plus: 151.LPlus$local: 152.Lpcrel6: 153 addi 3, 3, 42 154 addi 3, 3, 42 155 pld 3, vec@got@pcrel(0), 1 156 .reloc .Lpcrel6+8,R_PPC64_PCREL_OPT,.-(.Lpcrel6+8) 157 lwa 3, 4(3) 158 blr 159 .long 0 160 .quad 0 161# CHECK-LABEL: Plus 162# CHECK: pld 3, 0(0), 1 163# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8 164# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 165# CHECK-NEXT: lwa 3, 4(3) 166# CHECK-NEXT: blr 167 168## 169# This section of tests contains the variable MCSymbol as part of the 170# MCSymbolRefExpr for the first parameter of the .reloc relocation. 171## 172 .globl VarLabelMinimal # -- Begin function 173 .p2align 4 174 .type VarLabelMinimal,@function 175VarLabelMinimal: 176.LVarLabelMinimal$local: 177 pld 3, vec@got@pcrel(0), 1 178.Lpcrel101=.-8 179 .reloc .Lpcrel101,R_PPC64_PCREL_OPT,.-.Lpcrel101 180 lwa 3, 4(3) 181 blr 182 .long 0 183 .quad 0 184# CHECK-LABEL: VarLabelMinimal 185# CHECK: pld 3, 0(0), 1 186# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 187# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8 188# CHECK-NEXT: lwa 3, 4(3) 189# CHECK-NEXT: blr 190 191 192 .globl VarLabelSingleInsnBetween 193 .p2align 4 194 .type VarLabelSingleInsnBetween,@function 195VarLabelSingleInsnBetween: 196.LVarLabelSingleInsnBetween$local: 197 pld 3, vec@got@pcrel(0), 1 198.Lpcrel102=.-8 199 addi 3, 3, 42 200 .reloc .Lpcrel102,R_PPC64_PCREL_OPT,.-.Lpcrel102 201 lwa 3, 4(3) 202 blr 203 .long 0 204 .quad 0 205# CHECK_LABEL: VarLabelSingleInsnBetween 206# CHECK: pld 3, 0(0), 1 207# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 208# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0xc 209# CHECK-NEXT: addi 3, 3, 42 210# CHECK-NEXT: lwa 3, 4(3) 211# CHECK-NEXT: blr 212 213 .globl VarLabelMultiInsnBetween # -- Begin function 214 .p2align 4 215 .type VarLabelMultiInsnBetween,@function 216VarLabelMultiInsnBetween: 217.LVarLabelMultiInsnBetween$local: 218 pld 3, vec@got@pcrel(0), 1 219.Lpcrel103=.-8 220 addi 3, 3, 42 221 addi 3, 3, 42 222 addi 3, 3, 42 223 addi 3, 3, 42 224 addi 3, 3, 42 225 .reloc .Lpcrel103,R_PPC64_PCREL_OPT,.-.Lpcrel103 226 lwa 3, 4(3) 227 blr 228 .long 0 229 .quad 0 230# CHECK_LABEL: VarLabelMultiInsnBetween 231# CHECK: pld 3, 0(0), 1 232# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 233# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x1c 234# CHECK-NEXT: addi 3, 3, 42 235# CHECK-NEXT: addi 3, 3, 42 236# CHECK-NEXT: addi 3, 3, 42 237# CHECK-NEXT: addi 3, 3, 42 238# CHECK-NEXT: addi 3, 3, 42 239# CHECK-NEXT: lwa 3, 4(3) 240# CHECK-NEXT: blr 241 242 243 .globl VarLabelPrefixInsnBetween # -- Begin function 244 .p2align 4 245 .type VarLabelPrefixInsnBetween,@function 246VarLabelPrefixInsnBetween: 247.LVarLabelPrefixInsnBetween$local: 248 pld 3, vec@got@pcrel(0), 1 249.Lpcrel104=.-8 250 addi 3, 3, 42 251 paddi 3, 3, 42, 0 252 addi 3, 3, 42 253 paddi 3, 3, 42, 0 254 addi 3, 3, 42 255 .reloc .Lpcrel104,R_PPC64_PCREL_OPT,.-.Lpcrel104 256 lwa 3, 4(3) 257 blr 258 .long 0 259 .quad 0 260# CHECK_LABEL: VarLabelPrefixInsnBetween 261# CHECK: pld 3, 0(0), 1 262# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 263# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x24 264# CHECK-NEXT: addi 3, 3, 42 265# CHECK-NEXT: paddi 3, 3, 42, 0 266# CHECK-NEXT: addi 3, 3, 42 267# CHECK-NEXT: paddi 3, 3, 42, 0 268# CHECK-NEXT: addi 3, 3, 42 269# CHECK-NEXT: lwa 3, 4(3) 270# CHECK-NEXT: blr 271 272 273 .globl VarLabelSpaceBetween # -- Begin function 274 .p2align 4 275 .type VarLabelSpaceBetween,@function 276VarLabelSpaceBetween: 277.LVarLabelSpaceBetween$local: 278 pld 3, vec@got@pcrel(0), 1 279.Lpcrel105=.-8 280 addi 3, 3, 42 281 paddi 3, 3, 42, 0 282 addi 3, 3, 42 283 .space 40, 0 284 paddi 3, 3, 42, 0 285 addi 3, 3, 42 286 .reloc .Lpcrel105,R_PPC64_PCREL_OPT,.-.Lpcrel105 287 lwa 3, 4(3) 288 blr 289 .long 0 290 .quad 0 291# CHECK_LABEL: VarLabelSpaceBetween 292# CHECK: pld 3, 0(0), 1 293# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 294# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x4c 295# CHECK-NEXT: addi 3, 3, 42 296# CHECK-NEXT: paddi 3, 3, 42, 0 297# CHECK-NEXT: addi 3, 3, 42 298# CHECK: paddi 3, 3, 42, 0 299# CHECK-NEXT: addi 3, 3, 42 300# CHECK-NEXT: lwa 3, 4(3) 301# CHECK-NEXT: blr 302 303 304 .globl VarLabelPlus 305 .p2align 4 306 .type VarLabelPlus,@function 307VarLabelPlus: 308.LVarLabelPlus$local: 309.Lpcrel106: 310 addi 3, 3, 42 311 addi 3, 3, 42 312 pld 3, vec@got@pcrel(0), 1 313 .reloc .Lpcrel106+8,R_PPC64_PCREL_OPT,.-(.Lpcrel106+8) 314 lwa 3, 4(3) 315 blr 316 .long 0 317 .quad 0 318# CHECK-LABEL: VarLabelPlus 319# CHECK: pld 3, 0(0), 1 320# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8 321# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 322# CHECK-NEXT: lwa 3, 4(3) 323# CHECK-NEXT: blr 324 325# Check the situation where the PLD requires an alignment nop. 326 .globl AlignPLD 327 .p2align 6 328 .type AlignPLD,@function 329 .space 60 # Force the pld to require an alignment nop. 330AlignPLD: 331.LAlignPLD$local: 332 pld 3, vec@got@pcrel(0), 1 333.Lpcrel201: 334 .reloc .Lpcrel201-8,R_PPC64_PCREL_OPT,.-(.Lpcrel201-8) 335 lwa 3, 4(3) 336 blr 337# CHECK-LABEL: AlignPLD 338# CHECK: nop 339# CHECK-NEXT: pld 3, 0(0), 1 340# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 341# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8 342# CHECK-NEXT: lwa 3, 4(3) 343# CHECK-NEXT: blr 344 345# The label and the pld are on the same line and so the nop is inserted before 346# the label and the relocation should work. 347 .globl AlignPLDSameLine 348 .p2align 6 349 .type AlignPLDSameLine,@function 350 .space 60 # Force the pld to require an alignment nop. 351AlignPLDSameLine: 352.LAlignPLDSameLine$local: 353.Lpcrel202: pld 3, vec@got@pcrel(0), 1 354 .reloc .Lpcrel202,R_PPC64_PCREL_OPT,.-.Lpcrel202 355 lwa 3, 4(3) 356 blr 357# CHECK-LABEL: AlignPLDSameLine 358# CHECK: nop 359# CHECK-NEXT: pld 3, 0(0), 1 360# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 361# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8 362# CHECK-NEXT: lwa 3, 4(3) 363# CHECK-NEXT: blr 364 365 .globl AlignPLDLabelBefore 366 .p2align 6 367 .type AlignPLDLabelBefore,@function 368 .space 60 # Force the pld to require an alignment nop. 369AlignPLDLabelBefore: 370.LAlignPLDLabelBefore$local: 371.Label: 372 pld 3, vec@got@pcrel(0), 1 373.Lpcrel203: 374 .reloc .Lpcrel203-8,R_PPC64_PCREL_OPT,.-(.Lpcrel203-8) 375 lwa 3, 4(3) 376 blr 377# CHECK-LABEL: AlignPLDLabelBefore 378# CHECK: nop 379# CHECK-NEXT: pld 3, 0(0), 1 380# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 381# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8 382# CHECK-NEXT: lwa 3, 4(3) 383# CHECK-NEXT: blr 384 385 .globl AlignPLDLabelSameLine 386 .p2align 6 387 .type AlignPLDLabelSameLine,@function 388 .space 60 # Force the pld to require an alignment nop. 389AlignPLDLabelSameLine: 390.Label2: pld 3, vec@got@pcrel(0), 1 391.Lpcrel204: 392 .reloc .Lpcrel204-8,R_PPC64_PCREL_OPT,.-(.Lpcrel204-8) 393 lwa 3, 4(3) 394 blr 395# CHECK-LABEL: AlignPLDLabelSameLine 396# CHECK: nop 397# CHECK-NEXT: pld 3, 0(0), 1 398# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec 399# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8 400# CHECK-NEXT: lwa 3, 4(3) 401# CHECK-NEXT: blr 402