Skip to content
abi-isel.ll 290 KiB
Newer Older
; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=i686-unknown-linux-gnu -march=x86 -relocation-model=static -code-model=small | FileCheck %s -check-prefix=LINUX-32-STATIC
; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=i686-unknown-linux-gnu -march=x86 -relocation-model=static -code-model=small | FileCheck %s -check-prefix=LINUX-32-PIC

; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=x86_64-unknown-linux-gnu -march=x86-64 -relocation-model=static -code-model=small | FileCheck %s -check-prefix=LINUX-64-STATIC
; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=x86_64-unknown-linux-gnu -march=x86-64 -relocation-model=pic -code-model=small | FileCheck %s -check-prefix=LINUX-64-PIC

; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=i686-apple-darwin -march=x86 -relocation-model=static -code-model=small | FileCheck %s -check-prefix=DARWIN-32-STATIC
; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=i686-apple-darwin -march=x86 -relocation-model=dynamic-no-pic -code-model=small | FileCheck %s -check-prefix=DARWIN-32-DYNAMIC
; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=i686-apple-darwin -march=x86 -relocation-model=pic -code-model=small | FileCheck %s -check-prefix=DARWIN-32-PIC

; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=x86_64-apple-darwin -march=x86-64 -relocation-model=static -code-model=small | FileCheck %s -check-prefix=DARWIN-64-STATIC
; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=x86_64-apple-darwin -march=x86-64 -relocation-model=dynamic-no-pic -code-model=small | FileCheck %s -check-prefix=DARWIN-64-DYNAMIC
; RUN: llvm-as < %s | llc -asm-verbose=0 -mtriple=x86_64-apple-darwin -march=x86-64 -relocation-model=pic -code-model=small | FileCheck %s -check-prefix=DARWIN-64-PIC

@src = external global [131072 x i32]
@dst = external global [131072 x i32]
@xsrc = external global [32 x i32]
@xdst = external global [32 x i32]
@ptr = external global i32*
@dsrc = global [131072 x i32] zeroinitializer, align 32
@ddst = global [131072 x i32] zeroinitializer, align 32
@dptr = global i32* null
@lsrc = internal global [131072 x i32] zeroinitializer
@ldst = internal global [131072 x i32] zeroinitializer
@lptr = internal global i32* null
@ifunc = external global void ()*
@difunc = global void ()* null
@lifunc = internal global void ()* null
@lxsrc = internal global [32 x i32] zeroinitializer, align 32
@lxdst = internal global [32 x i32] zeroinitializer, align 32
@dxsrc = global [32 x i32] zeroinitializer, align 32
@dxdst = global [32 x i32] zeroinitializer, align 32

define void @foo00() nounwind {
entry:
	%0 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 0), align 4
	store i32 %0, i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 0), align 4
	ret void
; LINUX-64-STATIC: movl	src(%rip), %eax
; LINUX-64-STATIC: movl	%eax, dst
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: foo00:
; LINUX-32-STATIC: 	movl	src, %eax
; LINUX-32-STATIC-NEXT: 	movl	%eax, dst
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo00:
; LINUX-32-PIC: 	movl	src, %eax
; LINUX-32-PIC-NEXT: 	movl	%eax, dst
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo00:
; LINUX-64-PIC: 	movq	src@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movl	(%rax), %eax
; LINUX-64-PIC-NEXT: 	movq	dst@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo00:
; DARWIN-32-STATIC: 	movl	_src, %eax
; DARWIN-32-STATIC-NEXT: 	movl	%eax, _dst
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo00:
; DARWIN-32-DYNAMIC: 	movl	L_src$non_lazy_ptr, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	(%eax), %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	L_dst$non_lazy_ptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo00:
; DARWIN-32-PIC: 	call	"L1$pb"
; DARWIN-32-PIC-NEXT: "L1$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	L_src$non_lazy_ptr-"L1$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	(%ecx), %ecx
; DARWIN-32-PIC-NEXT: 	movl	L_dst$non_lazy_ptr-"L1$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, (%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo00:
; DARWIN-64-STATIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-STATIC-NEXT: 	movq	_dst@GOTPCREL(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo00:
; DARWIN-64-DYNAMIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_dst@GOTPCREL(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo00:
; DARWIN-64-PIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-PIC-NEXT: 	movq	_dst@GOTPCREL(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @fxo00() nounwind {
entry:
	%0 = load i32* getelementptr ([32 x i32]* @xsrc, i32 0, i64 0), align 4
	store i32 %0, i32* getelementptr ([32 x i32]* @xdst, i32 0, i64 0), align 4
	ret void
; LINUX-64-STATIC: movl	xsrc(%rip), %eax
; LINUX-64-STATIC: movl	%eax, xdst
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: fxo00:
; LINUX-32-STATIC: 	movl	xsrc, %eax
; LINUX-32-STATIC-NEXT: 	movl	%eax, xdst
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: fxo00:
; LINUX-32-PIC: 	movl	xsrc, %eax
; LINUX-32-PIC-NEXT: 	movl	%eax, xdst
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: fxo00:
; LINUX-64-PIC: 	movq	xsrc@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movl	(%rax), %eax
; LINUX-64-PIC-NEXT: 	movq	xdst@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _fxo00:
; DARWIN-32-STATIC: 	movl	_xsrc, %eax
; DARWIN-32-STATIC-NEXT: 	movl	%eax, _xdst
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _fxo00:
; DARWIN-32-DYNAMIC: 	movl	L_xsrc$non_lazy_ptr, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	(%eax), %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	L_xdst$non_lazy_ptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _fxo00:
; DARWIN-32-PIC: 	call	"L2$pb"
; DARWIN-32-PIC-NEXT: "L2$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	L_xsrc$non_lazy_ptr-"L2$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	(%ecx), %ecx
; DARWIN-32-PIC-NEXT: 	movl	L_xdst$non_lazy_ptr-"L2$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, (%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _fxo00:
; DARWIN-64-STATIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-STATIC-NEXT: 	movq	_xdst@GOTPCREL(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _fxo00:
; DARWIN-64-DYNAMIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_xdst@GOTPCREL(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _fxo00:
; DARWIN-64-PIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-PIC-NEXT: 	movq	_xdst@GOTPCREL(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @foo01() nounwind {
entry:
	store i32* getelementptr ([131072 x i32]* @dst, i32 0, i32 0), i32** @ptr, align 8
	ret void
; LINUX-64-STATIC: foo01:
; LINUX-64-STATIC: movq	$dst, ptr
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: foo01:
; LINUX-32-STATIC: 	movl	$dst, ptr
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo01:
; LINUX-32-PIC: 	movl	$dst, ptr
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo01:
; LINUX-64-PIC: 	movq	dst@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movq	ptr@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movq	%rax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo01:
; DARWIN-32-STATIC: 	movl	$_dst, _ptr
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo01:
; DARWIN-32-DYNAMIC: 	movl	L_dst$non_lazy_ptr, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	L_ptr$non_lazy_ptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo01:
; DARWIN-32-PIC: 	call	"L3$pb"
; DARWIN-32-PIC-NEXT: "L3$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	L_dst$non_lazy_ptr-"L3$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	L_ptr$non_lazy_ptr-"L3$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, (%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo01:
; DARWIN-64-STATIC: 	movq	_dst@GOTPCREL(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movq	%rax, (%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo01:
; DARWIN-64-DYNAMIC: 	movq	_dst@GOTPCREL(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movq	%rax, (%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo01:
; DARWIN-64-PIC: 	movq	_dst@GOTPCREL(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movq	%rax, (%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @fxo01() nounwind {
entry:
	store i32* getelementptr ([32 x i32]* @xdst, i32 0, i32 0), i32** @ptr, align 8
	ret void
; LINUX-64-STATIC: fxo01:
; LINUX-64-STATIC: movq	$xdst, ptr
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: fxo01:
; LINUX-32-STATIC: 	movl	$xdst, ptr
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: fxo01:
; LINUX-32-PIC: 	movl	$xdst, ptr
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: fxo01:
; LINUX-64-PIC: 	movq	xdst@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movq	ptr@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movq	%rax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _fxo01:
; DARWIN-32-STATIC: 	movl	$_xdst, _ptr
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _fxo01:
; DARWIN-32-DYNAMIC: 	movl	L_xdst$non_lazy_ptr, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	L_ptr$non_lazy_ptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _fxo01:
; DARWIN-32-PIC: 	call	"L4$pb"
; DARWIN-32-PIC-NEXT: "L4$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	L_xdst$non_lazy_ptr-"L4$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	L_ptr$non_lazy_ptr-"L4$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, (%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _fxo01:
; DARWIN-64-STATIC: 	movq	_xdst@GOTPCREL(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movq	%rax, (%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _fxo01:
; DARWIN-64-DYNAMIC: 	movq	_xdst@GOTPCREL(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movq	%rax, (%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _fxo01:
; DARWIN-64-PIC: 	movq	_xdst@GOTPCREL(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movq	%rax, (%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @foo02() nounwind {
entry:
	%0 = load i32** @ptr, align 8
	%1 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 0), align 4
	store i32 %1, i32* %0, align 4
	ret void
; LINUX-64-STATIC: movl    src(%rip), %
; LINUX-64-STATIC: movq    ptr(%rip), %
; LINUX-64-STATIC: movl
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: foo02:
; LINUX-32-STATIC: 	movl	src, %eax
; LINUX-32-STATIC-NEXT: 	movl	ptr, %ecx
; LINUX-32-STATIC-NEXT: 	movl	%eax, (%ecx)
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo02:
; LINUX-32-PIC: 	movl	src, %eax
; LINUX-32-PIC-NEXT: 	movl	ptr, %ecx
; LINUX-32-PIC-NEXT: 	movl	%eax, (%ecx)
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo02:
; LINUX-64-PIC: 	movq	src@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movl	(%rax), %eax
; LINUX-64-PIC-NEXT: 	movq	ptr@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movq	(%rcx), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo02:
; DARWIN-32-STATIC: 	movl	_src, %eax
; DARWIN-32-STATIC-NEXT: 	movl	_ptr, %ecx
; DARWIN-32-STATIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo02:
; DARWIN-32-DYNAMIC: 	movl	L_src$non_lazy_ptr, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	(%eax), %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	L_ptr$non_lazy_ptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	(%ecx), %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo02:
; DARWIN-32-PIC: 	call	"L5$pb"
; DARWIN-32-PIC-NEXT: "L5$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	L_src$non_lazy_ptr-"L5$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	(%ecx), %ecx
; DARWIN-32-PIC-NEXT: 	movl	L_ptr$non_lazy_ptr-"L5$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, (%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo02:
; DARWIN-64-STATIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-STATIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movq	(%rcx), %rcx
; DARWIN-64-STATIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo02:
; DARWIN-64-DYNAMIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movq	(%rcx), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo02:
; DARWIN-64-PIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-PIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movq	(%rcx), %rcx
; DARWIN-64-PIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @fxo02() nounwind {
entry:
	%0 = load i32** @ptr, align 8
	%1 = load i32* getelementptr ([32 x i32]* @xsrc, i32 0, i64 0), align 4
	store i32 %1, i32* %0, align 4
; LINUX-64-STATIC: movl    xsrc(%rip), %
; LINUX-64-STATIC: movq    ptr(%rip), %
; LINUX-64-STATIC: movl
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: fxo02:
; LINUX-32-STATIC: 	movl	xsrc, %eax
; LINUX-32-STATIC-NEXT: 	movl	ptr, %ecx
; LINUX-32-STATIC-NEXT: 	movl	%eax, (%ecx)
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: fxo02:
; LINUX-32-PIC: 	movl	xsrc, %eax
; LINUX-32-PIC-NEXT: 	movl	ptr, %ecx
; LINUX-32-PIC-NEXT: 	movl	%eax, (%ecx)
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: fxo02:
; LINUX-64-PIC: 	movq	xsrc@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movl	(%rax), %eax
; LINUX-64-PIC-NEXT: 	movq	ptr@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movq	(%rcx), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _fxo02:
; DARWIN-32-STATIC: 	movl	_xsrc, %eax
; DARWIN-32-STATIC-NEXT: 	movl	_ptr, %ecx
; DARWIN-32-STATIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _fxo02:
; DARWIN-32-DYNAMIC: 	movl	L_xsrc$non_lazy_ptr, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	(%eax), %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	L_ptr$non_lazy_ptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	(%ecx), %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _fxo02:
; DARWIN-32-PIC: 	call	"L6$pb"
; DARWIN-32-PIC-NEXT: "L6$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	L_xsrc$non_lazy_ptr-"L6$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	(%ecx), %ecx
; DARWIN-32-PIC-NEXT: 	movl	L_ptr$non_lazy_ptr-"L6$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, (%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _fxo02:
; DARWIN-64-STATIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-STATIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movq	(%rcx), %rcx
; DARWIN-64-STATIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _fxo02:
; DARWIN-64-DYNAMIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movq	(%rcx), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _fxo02:
; DARWIN-64-PIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movl	(%rax), %eax
; DARWIN-64-PIC-NEXT: 	movq	_ptr@GOTPCREL(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movq	(%rcx), %rcx
; DARWIN-64-PIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @foo03() nounwind {
entry:
	%0 = load i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 0), align 32
	store i32 %0, i32* getelementptr ([131072 x i32]* @ddst, i32 0, i64 0), align 32
	ret void
; LINUX-64-STATIC: movl    dsrc(%rip), %eax
; LINUX-64-STATIC: movl    %eax, ddst
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: foo03:
; LINUX-32-STATIC: 	movl	dsrc, %eax
; LINUX-32-STATIC-NEXT: 	movl	%eax, ddst
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo03:
; LINUX-32-PIC: 	movl	dsrc, %eax
; LINUX-32-PIC-NEXT: 	movl	%eax, ddst
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo03:
; LINUX-64-PIC: 	movq	dsrc@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movl	(%rax), %eax
; LINUX-64-PIC-NEXT: 	movq	ddst@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo03:
; DARWIN-32-STATIC: 	movl	_dsrc, %eax
; DARWIN-32-STATIC-NEXT: 	movl	%eax, _ddst
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo03:
; DARWIN-32-DYNAMIC: 	movl	_dsrc, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, _ddst
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo03:
; DARWIN-32-PIC: 	call	"L7$pb"
; DARWIN-32-PIC-NEXT: "L7$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	_dsrc-"L7$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	%ecx, _ddst-"L7$pb"(%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo03:
; DARWIN-64-STATIC: 	movl	_dsrc(%rip), %eax
; DARWIN-64-STATIC-NEXT: 	movl	%eax, _ddst(%rip)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo03:
; DARWIN-64-DYNAMIC: 	movl	_dsrc(%rip), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, _ddst(%rip)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo03:
; DARWIN-64-PIC: 	movl	_dsrc(%rip), %eax
; DARWIN-64-PIC-NEXT: 	movl	%eax, _ddst(%rip)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @foo04() nounwind {
entry:
	store i32* getelementptr ([131072 x i32]* @ddst, i32 0, i32 0), i32** @dptr, align 8
	ret void
; LINUX-64-STATIC: foo04:
; LINUX-64-STATIC: movq    $ddst, dptr
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: foo04:
; LINUX-32-STATIC: 	movl	$ddst, dptr
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo04:
; LINUX-32-PIC: 	movl	$ddst, dptr
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo04:
; LINUX-64-PIC: 	movq	ddst@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movq	dptr@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movq	%rax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo04:
; DARWIN-32-STATIC: 	movl	$_ddst, _dptr
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo04:
; DARWIN-32-DYNAMIC: 	movl	$_ddst, _dptr
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo04:
; DARWIN-32-PIC: 	call	"L8$pb"
; DARWIN-32-PIC-NEXT: "L8$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	leal	_ddst-"L8$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	%ecx, _dptr-"L8$pb"(%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo04:
; DARWIN-64-STATIC: 	leaq	_ddst(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movq	%rax, _dptr(%rip)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo04:
; DARWIN-64-DYNAMIC: 	leaq	_ddst(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movq	%rax, _dptr(%rip)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo04:
; DARWIN-64-PIC: 	leaq	_ddst(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movq	%rax, _dptr(%rip)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @foo05() nounwind {
entry:
	%0 = load i32** @dptr, align 8
	%1 = load i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 0), align 32
	store i32 %1, i32* %0, align 4
	ret void
; LINUX-64-STATIC: movl    dsrc(%rip), %
; LINUX-64-STATIC: movq    dptr(%rip), %
; LINUX-64-STATIC: movl
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: foo05:
; LINUX-32-STATIC: 	movl	dsrc, %eax
; LINUX-32-STATIC-NEXT: 	movl	dptr, %ecx
; LINUX-32-STATIC-NEXT: 	movl	%eax, (%ecx)
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo05:
; LINUX-32-PIC: 	movl	dsrc, %eax
; LINUX-32-PIC-NEXT: 	movl	dptr, %ecx
; LINUX-32-PIC-NEXT: 	movl	%eax, (%ecx)
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo05:
; LINUX-64-PIC: 	movq	dsrc@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movl	(%rax), %eax
; LINUX-64-PIC-NEXT: 	movq	dptr@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movq	(%rcx), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo05:
; DARWIN-32-STATIC: 	movl	_dsrc, %eax
; DARWIN-32-STATIC-NEXT: 	movl	_dptr, %ecx
; DARWIN-32-STATIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo05:
; DARWIN-32-DYNAMIC: 	movl	_dsrc, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	_dptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo05:
; DARWIN-32-PIC: 	call	"L9$pb"
; DARWIN-32-PIC-NEXT: "L9$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	_dsrc-"L9$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	_dptr-"L9$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, (%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo05:
; DARWIN-64-STATIC: 	movl	_dsrc(%rip), %eax
; DARWIN-64-STATIC-NEXT: 	movq	_dptr(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo05:
; DARWIN-64-DYNAMIC: 	movl	_dsrc(%rip), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_dptr(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo05:
; DARWIN-64-PIC: 	movl	_dsrc(%rip), %eax
; DARWIN-64-PIC-NEXT: 	movq	_dptr(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @foo06() nounwind {
entry:
	%0 = load i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 0), align 4
	store i32 %0, i32* getelementptr ([131072 x i32]* @ldst, i32 0, i64 0), align 4
	ret void
; LINUX-64-STATIC: movl    lsrc(%rip), %eax
; LINUX-64-STATIC: movl    %eax, ldst(%rip)

; LINUX-32-STATIC: foo06:
; LINUX-32-STATIC: 	movl	lsrc, %eax
; LINUX-32-STATIC-NEXT: 	movl	%eax, ldst
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo06:
; LINUX-32-PIC: 	movl	lsrc, %eax
; LINUX-32-PIC-NEXT: 	movl	%eax, ldst
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo06:
; LINUX-64-PIC: 	movl	lsrc(%rip), %eax
; LINUX-64-PIC-NEXT: 	movl	%eax, ldst(%rip)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo06:
; DARWIN-32-STATIC: 	movl	_lsrc, %eax
; DARWIN-32-STATIC-NEXT: 	movl	%eax, _ldst
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo06:
; DARWIN-32-DYNAMIC: 	movl	_lsrc, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, _ldst
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo06:
; DARWIN-32-PIC: 	call	"L10$pb"
; DARWIN-32-PIC-NEXT: "L10$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	_lsrc-"L10$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	%ecx, _ldst-"L10$pb"(%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo06:
; DARWIN-64-STATIC: 	movl	_lsrc(%rip), %eax
; DARWIN-64-STATIC-NEXT: 	movl	%eax, _ldst(%rip)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo06:
; DARWIN-64-DYNAMIC: 	movl	_lsrc(%rip), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, _ldst(%rip)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo06:
; DARWIN-64-PIC: 	movl	_lsrc(%rip), %eax
; DARWIN-64-PIC-NEXT: 	movl	%eax, _ldst(%rip)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @foo07() nounwind {
entry:
	store i32* getelementptr ([131072 x i32]* @ldst, i32 0, i32 0), i32** @lptr, align 8
	ret void
; LINUX-64-STATIC: foo07:
; LINUX-64-STATIC: movq    $ldst, lptr
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: foo07:
; LINUX-32-STATIC: 	movl	$ldst, lptr
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo07:
; LINUX-32-PIC: 	movl	$ldst, lptr
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo07:
; LINUX-64-PIC: 	leaq	ldst(%rip), %rax
; LINUX-64-PIC-NEXT: 	movq	%rax, lptr(%rip)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo07:
; DARWIN-32-STATIC: 	movl	$_ldst, _lptr
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo07:
; DARWIN-32-DYNAMIC: 	movl	$_ldst, _lptr
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo07:
; DARWIN-32-PIC: 	call	"L11$pb"
; DARWIN-32-PIC-NEXT: "L11$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	leal	_ldst-"L11$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	%ecx, _lptr-"L11$pb"(%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo07:
; DARWIN-64-STATIC: 	leaq	_ldst(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movq	%rax, _lptr(%rip)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo07:
; DARWIN-64-DYNAMIC: 	leaq	_ldst(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movq	%rax, _lptr(%rip)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo07:
; DARWIN-64-PIC: 	leaq	_ldst(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movq	%rax, _lptr(%rip)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @foo08() nounwind {
entry:
	%0 = load i32** @lptr, align 8
	%1 = load i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 0), align 4
	store i32 %1, i32* %0, align 4
	ret void
; LINUX-64-STATIC: movl    lsrc(%rip), %
; LINUX-64-STATIC: movq    lptr(%rip), %
; LINUX-64-STATIC: movl
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: foo08:
; LINUX-32-STATIC: 	movl	lsrc, %eax
; LINUX-32-STATIC-NEXT: 	movl	lptr, %ecx
; LINUX-32-STATIC-NEXT: 	movl	%eax, (%ecx)
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: foo08:
; LINUX-32-PIC: 	movl	lsrc, %eax
; LINUX-32-PIC-NEXT: 	movl	lptr, %ecx
; LINUX-32-PIC-NEXT: 	movl	%eax, (%ecx)
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: foo08:
; LINUX-64-PIC: 	movl	lsrc(%rip), %eax
; LINUX-64-PIC-NEXT: 	movq	lptr(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _foo08:
; DARWIN-32-STATIC: 	movl	_lsrc, %eax
; DARWIN-32-STATIC-NEXT: 	movl	_lptr, %ecx
; DARWIN-32-STATIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _foo08:
; DARWIN-32-DYNAMIC: 	movl	_lsrc, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	_lptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, (%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _foo08:
; DARWIN-32-PIC: 	call	"L12$pb"
; DARWIN-32-PIC-NEXT: "L12$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	_lsrc-"L12$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	_lptr-"L12$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, (%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _foo08:
; DARWIN-64-STATIC: 	movl	_lsrc(%rip), %eax
; DARWIN-64-STATIC-NEXT: 	movq	_lptr(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _foo08:
; DARWIN-64-DYNAMIC: 	movl	_lsrc(%rip), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_lptr(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _foo08:
; DARWIN-64-PIC: 	movl	_lsrc(%rip), %eax
; DARWIN-64-PIC-NEXT: 	movq	_lptr(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movl	%eax, (%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @qux00() nounwind {
entry:
	%0 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 16), align 4
	store i32 %0, i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 16), align 4
	ret void
; LINUX-64-STATIC: movl    src+64(%rip), %eax
; LINUX-64-STATIC: movl    %eax, dst+64(%rip)

; LINUX-32-STATIC: qux00:
; LINUX-32-STATIC: 	movl	src+64, %eax
; LINUX-32-STATIC-NEXT: 	movl	%eax, dst+64
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: qux00:
; LINUX-32-PIC: 	movl	src+64, %eax
; LINUX-32-PIC-NEXT: 	movl	%eax, dst+64
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: qux00:
; LINUX-64-PIC: 	movq	src@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movl	64(%rax), %eax
; LINUX-64-PIC-NEXT: 	movq	dst@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, 64(%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _qux00:
; DARWIN-32-STATIC: 	movl	_src+64, %eax
; DARWIN-32-STATIC-NEXT: 	movl	%eax, _dst+64
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _qux00:
; DARWIN-32-DYNAMIC: 	movl	L_src$non_lazy_ptr, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	64(%eax), %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	L_dst$non_lazy_ptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, 64(%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _qux00:
; DARWIN-32-PIC: 	call	"L13$pb"
; DARWIN-32-PIC-NEXT: "L13$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	L_src$non_lazy_ptr-"L13$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	64(%ecx), %ecx
; DARWIN-32-PIC-NEXT: 	movl	L_dst$non_lazy_ptr-"L13$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, 64(%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _qux00:
; DARWIN-64-STATIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movl	64(%rax), %eax
; DARWIN-64-STATIC-NEXT: 	movq	_dst@GOTPCREL(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movl	%eax, 64(%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _qux00:
; DARWIN-64-DYNAMIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movl	64(%rax), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_dst@GOTPCREL(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, 64(%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _qux00:
; DARWIN-64-PIC: 	movq	_src@GOTPCREL(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movl	64(%rax), %eax
; DARWIN-64-PIC-NEXT: 	movq	_dst@GOTPCREL(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movl	%eax, 64(%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @qxx00() nounwind {
entry:
	%0 = load i32* getelementptr ([32 x i32]* @xsrc, i32 0, i64 16), align 4
	store i32 %0, i32* getelementptr ([32 x i32]* @xdst, i32 0, i64 16), align 4
	ret void
; LINUX-64-STATIC: movl    xsrc+64(%rip), %eax
; LINUX-64-STATIC: movl    %eax, xdst+64(%rip)

; LINUX-32-STATIC: qxx00:
; LINUX-32-STATIC: 	movl	xsrc+64, %eax
; LINUX-32-STATIC-NEXT: 	movl	%eax, xdst+64
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: qxx00:
; LINUX-32-PIC: 	movl	xsrc+64, %eax
; LINUX-32-PIC-NEXT: 	movl	%eax, xdst+64
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: qxx00:
; LINUX-64-PIC: 	movq	xsrc@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	movl	64(%rax), %eax
; LINUX-64-PIC-NEXT: 	movq	xdst@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movl	%eax, 64(%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _qxx00:
; DARWIN-32-STATIC: 	movl	_xsrc+64, %eax
; DARWIN-32-STATIC-NEXT: 	movl	%eax, _xdst+64
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _qxx00:
; DARWIN-32-DYNAMIC: 	movl	L_xsrc$non_lazy_ptr, %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	64(%eax), %eax
; DARWIN-32-DYNAMIC-NEXT: 	movl	L_xdst$non_lazy_ptr, %ecx
; DARWIN-32-DYNAMIC-NEXT: 	movl	%eax, 64(%ecx)
; DARWIN-32-DYNAMIC-NEXT: 	ret

; DARWIN-32-PIC: _qxx00:
; DARWIN-32-PIC: 	call	"L14$pb"
; DARWIN-32-PIC-NEXT: "L14$pb":
; DARWIN-32-PIC-NEXT: 	popl	%eax
; DARWIN-32-PIC-NEXT: 	movl	L_xsrc$non_lazy_ptr-"L14$pb"(%eax), %ecx
; DARWIN-32-PIC-NEXT: 	movl	64(%ecx), %ecx
; DARWIN-32-PIC-NEXT: 	movl	L_xdst$non_lazy_ptr-"L14$pb"(%eax), %eax
; DARWIN-32-PIC-NEXT: 	movl	%ecx, 64(%eax)
; DARWIN-32-PIC-NEXT: 	ret

; DARWIN-64-STATIC: _qxx00:
; DARWIN-64-STATIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-STATIC-NEXT: 	movl	64(%rax), %eax
; DARWIN-64-STATIC-NEXT: 	movq	_xdst@GOTPCREL(%rip), %rcx
; DARWIN-64-STATIC-NEXT: 	movl	%eax, 64(%rcx)
; DARWIN-64-STATIC-NEXT: 	ret

; DARWIN-64-DYNAMIC: _qxx00:
; DARWIN-64-DYNAMIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-DYNAMIC-NEXT: 	movl	64(%rax), %eax
; DARWIN-64-DYNAMIC-NEXT: 	movq	_xdst@GOTPCREL(%rip), %rcx
; DARWIN-64-DYNAMIC-NEXT: 	movl	%eax, 64(%rcx)
; DARWIN-64-DYNAMIC-NEXT: 	ret

; DARWIN-64-PIC: _qxx00:
; DARWIN-64-PIC: 	movq	_xsrc@GOTPCREL(%rip), %rax
; DARWIN-64-PIC-NEXT: 	movl	64(%rax), %eax
; DARWIN-64-PIC-NEXT: 	movq	_xdst@GOTPCREL(%rip), %rcx
; DARWIN-64-PIC-NEXT: 	movl	%eax, 64(%rcx)
; DARWIN-64-PIC-NEXT: 	ret
}

define void @qux01() nounwind {
entry:
	store i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 16), i32** @ptr, align 8
	ret void
; LINUX-64-STATIC: qux01:
; LINUX-64-STATIC: movq    $dst+64, ptr
; LINUX-64-STATIC: ret

; LINUX-32-STATIC: qux01:
; LINUX-32-STATIC: 	movl	$dst+64, ptr
; LINUX-32-STATIC-NEXT: 	ret

; LINUX-32-PIC: qux01:
; LINUX-32-PIC: 	movl	$dst+64, ptr
; LINUX-32-PIC-NEXT: 	ret

; LINUX-64-PIC: qux01:
; LINUX-64-PIC: 	movq	dst@GOTPCREL(%rip), %rax
; LINUX-64-PIC-NEXT: 	addq	$64, %rax
; LINUX-64-PIC-NEXT: 	movq	ptr@GOTPCREL(%rip), %rcx
; LINUX-64-PIC-NEXT: 	movq	%rax, (%rcx)
; LINUX-64-PIC-NEXT: 	ret

; DARWIN-32-STATIC: _qux01:
; DARWIN-32-STATIC: 	movl	$_dst+64, _ptr
; DARWIN-32-STATIC-NEXT: 	ret

; DARWIN-32-DYNAMIC: _qux01: