# RUN: llvm-mc -triple=powerpc64le -filetype=obj %s | \
# RUN: llvm-objdump -dr --mcpu=pwr10 - | FileCheck %s
# RUN: llvm-mc -triple=powerpc64 -filetype=obj %s | \
# RUN: llvm-objdump -dr --mcpu=pwr10 - | FileCheck %s
##
# This section of tests contains the MCBinaryExpr as the first parameter of the
# .reloc relocation.
##
.text
.abiversion 2
.globl Minimal
.p2align 4
.type Minimal,@function
Minimal:
.LMinimal$local:
pld 3, vec@got@ , 1
.Lpcrel1:
.reloc .Lpcrel1-8,R_PPC64_PCREL_OPT,.-(.Lpcrel1-8)
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: Minimal
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl SingleInsnBetween
.p2align 4
.type SingleInsnBetween,@function
SingleInsnBetween:
.LSingleInsnBetween$local:
pld 3, vec@got@ , 1
.Lpcrel2:
addi 3, 3, 42
.reloc .Lpcrel2-8,R_PPC64_PCREL_OPT,.-(.Lpcrel2-8)
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: SingleInsnBetween
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0xc
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl MultiInsnBetween # -- Begin function
.p2align 4
.type MultiInsnBetween,@function
MultiInsnBetween:
.LMultiInsnBetween$local:
pld 3, vec@got@ , 1
.Lpcrel3:
addi 3, 3, 42
addi 3, 3, 42
addi 3, 3, 42
addi 3, 3, 42
addi 3, 3, 42
.reloc .Lpcrel3-8,R_PPC64_PCREL_OPT,.-(.Lpcrel3-8)
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: MultiInsnBetween
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x1c
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl PrefixInsnBetween
.p2align 6
.type PrefixInsnBetween,@function
.space 48 # Add a space to force an alignment of a paddi.
PrefixInsnBetween:
.LPrefixInsnBetween$local:
pld 3, vec@got@ , 1
.Lpcrel4:
addi 3, 3, 42
paddi 3, 3, 42, 0
addi 3, 3, 42
paddi 3, 3, 42, 0
addi 3, 3, 42
.reloc .Lpcrel4-8,R_PPC64_PCREL_OPT,.-(.Lpcrel4-8)
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: PrefixInsnBetween
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x28
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: nop
# CHECK-NEXT: paddi 3, 3, 42, 0
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: paddi 3, 3, 42, 0
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl SpaceBetween # -- Begin function
.p2align 4
.type SpaceBetween,@function
SpaceBetween:
.LSpaceBetween$local:
pld 3, vec@got@ , 1
.Lpcrel5:
addi 3, 3, 42
paddi 3, 3, 42, 0
addi 3, 3, 42
.space 40, 0
paddi 3, 3, 42, 0
addi 3, 3, 42
.reloc .Lpcrel5-8,R_PPC64_PCREL_OPT,.-(.Lpcrel5-8)
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: SpaceBetween
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x50
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: nop
# CHECK-NEXT: paddi 3, 3, 42, 0
# CHECK-NEXT: addi 3, 3, 42
# CHECK: paddi 3, 3, 42, 0
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl Plus
.p2align 4
.type Plus,@function
Plus:
.LPlus$local:
.Lpcrel6:
addi 3, 3, 42
addi 3, 3, 42
pld 3, vec@got@ , 1
.reloc .Lpcrel6+8,R_PPC64_PCREL_OPT,.-(.Lpcrel6+8)
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: Plus
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
##
# This section of tests contains the variable MCSymbol as part of the
# MCSymbolRefExpr for the first parameter of the .reloc relocation.
##
.globl VarLabelMinimal # -- Begin function
.p2align 4
.type VarLabelMinimal,@function
VarLabelMinimal:
.LVarLabelMinimal$local:
pld 3, vec@got@ , 1
.Lpcrel101=.-8
.reloc .Lpcrel101,R_PPC64_PCREL_OPT,.-.Lpcrel101
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: VarLabelMinimal
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl VarLabelSingleInsnBetween
.p2align 4
.type VarLabelSingleInsnBetween,@function
VarLabelSingleInsnBetween:
.LVarLabelSingleInsnBetween$local:
pld 3, vec@got@ , 1
.Lpcrel102=.-8
addi 3, 3, 42
.reloc .Lpcrel102,R_PPC64_PCREL_OPT,.-.Lpcrel102
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: VarLabelSingleInsnBetween
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0xc
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl VarLabelMultiInsnBetween # -- Begin function
.p2align 4
.type VarLabelMultiInsnBetween,@function
VarLabelMultiInsnBetween:
.LVarLabelMultiInsnBetween$local:
pld 3, vec@got@ , 1
.Lpcrel103=.-8
addi 3, 3, 42
addi 3, 3, 42
addi 3, 3, 42
addi 3, 3, 42
addi 3, 3, 42
.reloc .Lpcrel103,R_PPC64_PCREL_OPT,.-.Lpcrel103
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: VarLabelMultiInsnBetween
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x1c
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl VarLabelPrefixInsnBetween # -- Begin function
.p2align 4
.type VarLabelPrefixInsnBetween,@function
VarLabelPrefixInsnBetween:
.LVarLabelPrefixInsnBetween$local:
pld 3, vec@got@ , 1
.Lpcrel104=.-8
addi 3, 3, 42
paddi 3, 3, 42, 0
addi 3, 3, 42
paddi 3, 3, 42, 0
addi 3, 3, 42
.reloc .Lpcrel104,R_PPC64_PCREL_OPT,.-.Lpcrel104
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: VarLabelPrefixInsnBetween
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x24
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: paddi 3, 3, 42, 0
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: paddi 3, 3, 42, 0
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl VarLabelSpaceBetween # -- Begin function
.p2align 4
.type VarLabelSpaceBetween,@function
VarLabelSpaceBetween:
.LVarLabelSpaceBetween$local:
pld 3, vec@got@ , 1
.Lpcrel105=.-8
addi 3, 3, 42
paddi 3, 3, 42, 0
addi 3, 3, 42
.space 40, 0
paddi 3, 3, 42, 0
addi 3, 3, 42
.reloc .Lpcrel105,R_PPC64_PCREL_OPT,.-.Lpcrel105
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: VarLabelSpaceBetween
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x4c
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: paddi 3, 3, 42, 0
# CHECK-NEXT: addi 3, 3, 42
# CHECK: paddi 3, 3, 42, 0
# CHECK-NEXT: addi 3, 3, 42
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl VarLabelPlus
.p2align 4
.type VarLabelPlus,@function
VarLabelPlus:
.LVarLabelPlus$local:
.Lpcrel106:
addi 3, 3, 42
addi 3, 3, 42
pld 3, vec@got@ , 1
.reloc .Lpcrel106+8,R_PPC64_PCREL_OPT,.-(.Lpcrel106+8)
lwa 3, 4(3)
blr
.long 0
.quad 0
# CHECK-LABEL: VarLabelPlus
# CHECK: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
# Check the situation where the PLD requires an alignment nop.
.globl AlignPLD
.p2align 6
.type AlignPLD,@function
.space 60 # Force the pld to require an alignment nop.
AlignPLD:
.LAlignPLD$local:
pld 3, vec@got@ , 1
.Lpcrel201:
.reloc .Lpcrel201-8,R_PPC64_PCREL_OPT,.-(.Lpcrel201-8)
lwa 3, 4(3)
blr
# CHECK-LABEL: AlignPLD
# CHECK: nop
# CHECK-NEXT: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
# The label and the pld are on the same line and so the nop is inserted before
# the label and the relocation should work.
.globl AlignPLDSameLine
.p2align 6
.type AlignPLDSameLine,@function
.space 60 # Force the pld to require an alignment nop.
AlignPLDSameLine:
.LAlignPLDSameLine$local:
.Lpcrel202: pld 3, vec@got@ , 1
.reloc .Lpcrel202,R_PPC64_PCREL_OPT,.-.Lpcrel202
lwa 3, 4(3)
blr
# CHECK-LABEL: AlignPLDSameLine
# CHECK: nop
# CHECK-NEXT: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl AlignPLDLabelBefore
.p2align 6
.type AlignPLDLabelBefore,@function
.space 60 # Force the pld to require an alignment nop.
AlignPLDLabelBefore:
.LAlignPLDLabelBefore$local:
.Label:
pld 3, vec@got@ , 1
.Lpcrel203:
.reloc .Lpcrel203-8,R_PPC64_PCREL_OPT,.-(.Lpcrel203-8)
lwa 3, 4(3)
blr
# CHECK-LABEL: AlignPLDLabelBefore
# CHECK: nop
# CHECK-NEXT: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr
.globl AlignPLDLabelSameLine
.p2align 6
.type AlignPLDLabelSameLine,@function
.space 60 # Force the pld to require an alignment nop.
AlignPLDLabelSameLine:
.Label2: pld 3, vec@got@ , 1
.Lpcrel204:
.reloc .Lpcrel204-8,R_PPC64_PCREL_OPT,.-(.Lpcrel204-8)
lwa 3, 4(3)
blr
# CHECK-LABEL: AlignPLDLabelSameLine
# CHECK: nop
# CHECK-NEXT: pld 3, 0(0), 1
# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec
# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8
# CHECK-NEXT: lwa 3, 4(3)
# CHECK-NEXT: blr