brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · ef2849c Raw
376 lines · plain
1; RUN: llc < %s -mcpu=generic -mtriple=i686-pc-linux-gnu -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-I6862; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-X323; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -fast-isel -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-X324 5@ptr = external global ptr 6@dst = external global i32 7@src = external global i32 8 9define void @test0() nounwind {10entry:11    store ptr @dst, ptr @ptr12    %tmp.s = load i32, ptr @src13    store i32 %tmp.s, ptr @dst14    ret void15    16; CHECK-LABEL:	test0:17; CHECK-I686:	calll	.L0$pb18; CHECK-I686-NEXT:	.L0$pb:19; CHECK-I686-NEXT:	popl20; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L0$pb),21; CHECK-I686:	movl	dst@GOT(%eax),22; CHECK-I686:	movl	ptr@GOT(%eax),23; CHECK-I686:	movl	src@GOT(%eax),24; CHECK-I686:	ret25; CHECK-X32-DAG:	movl	dst@GOTPCREL(%rip),26; CHECK-X32-DAG:	movl	ptr@GOTPCREL(%rip),27; CHECK-X32-DAG:	movl	src@GOTPCREL(%rip),28; CHECK-X32:	retq29}30 31@ptr2 = global ptr null32@dst2 = global i32 033@src2 = global i32 034 35define void @test1() nounwind {36entry:37    store ptr @dst2, ptr @ptr238    %tmp.s = load i32, ptr @src239    store i32 %tmp.s, ptr @dst240    ret void41    42; CHECK-LABEL:	test1:43; CHECK-I686:	calll	.L1$pb44; CHECK-I686-NEXT:	.L1$pb:45; CHECK-I686-NEXT:	popl46; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L1$pb), %eax47; CHECK-I686:	movl	dst2@GOT(%eax),48; CHECK-I686:	movl	ptr2@GOT(%eax),49; CHECK-I686:	movl	src2@GOT(%eax),50; CHECK-I686:	ret51; CHECK-X32-DAG:	movl	dst2@GOTPCREL(%rip),52; CHECK-X32-DAG:	movl	ptr2@GOTPCREL(%rip),53; CHECK-X32-DAG:	movl	src2@GOTPCREL(%rip),54; CHECK-X32:	retq55 56}57 58declare ptr @malloc(i32)59 60define void @test2() nounwind {61entry:62    %ptr = call ptr @malloc(i32 40)63    ret void64; CHECK-LABEL:	test2:65; CHECK-I686:	pushl	%ebx66; CHECK-I686-NEXT:	subl	$8, %esp67; CHECK-I686-NEXT:	calll	.L2$pb68; CHECK-I686-NEXT:	.L2$pb:69; CHECK-I686-NEXT:	popl	%ebx70; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L2$pb), %ebx71; CHECK-I686:	movl	$40, (%esp)72; CHECK-I686:	calll	malloc@PLT73; CHECK-I686:	addl	$8, %esp74; CHECK-I686:	popl	%ebx75; CHECK-I686:	ret76; CHECK-X32:	pushq	%rax77; CHECK-X32:	movl	$40, %edi78; CHECK-X32:	callq	malloc@PLT79; CHECK-X32:	popq	%rax80; CHECK-X32:	retq81 82}83 84@pfoo = external global ptr 85 86define void @test3() nounwind {87entry:88    %tmp = call ptr(...) @afoo()89    store ptr %tmp, ptr @pfoo90    %tmp1 = load ptr, ptr @pfoo91    call void(...) %tmp1()92    ret void93; CHECK-LABEL:	test3:94; CHECK-I686:	calll	.L3$pb95; CHECK-I686-NEXT:	.L3$pb:96; CHECK-I686:	popl97; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L3$pb), %[[REG3:e..]]98; CHECK-I686:	calll	afoo@PLT99; CHECK-I686:	movl	pfoo@GOT(%[[REG3]]),100; CHECK-I686:	calll	*101; CHECK-X32:	callq	afoo@PLT102; CHECK-X32:	movl	pfoo@GOTPCREL(%rip),103; CHECK-X32:	callq	*104}105 106declare ptr @afoo(...)107 108define void @test4() nounwind {109entry:110    call void(...) @foo()111    ret void112; CHECK-LABEL:	test4:113; CHECK-I686:	calll	.L4$pb114; CHECK-I686:	popl	%ebx115; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L4$pb), %ebx116; CHECK-I686:	calll	foo@PLT117; CHECK-X32:	callq	foo@PLT118 119}120 121declare void @foo(...)122 123 124@ptr6 = internal global ptr null125@dst6 = internal global i32 0126@src6 = internal global i32 0127 128define void @test5() nounwind {129entry:130    store ptr @dst6, ptr @ptr6131    %tmp.s = load i32, ptr @src6132    store i32 %tmp.s, ptr @dst6133    ret void134    135; CHECK-LABEL:	test5:136; CHECK-I686:	calll	.L5$pb137; CHECK-I686-NEXT:	.L5$pb:138; CHECK-I686-NEXT:	popl	%eax139; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L5$pb), %eax140; CHECK-I686:	leal	dst6@GOTOFF(%eax), %ecx141; CHECK-I686:	movl	%ecx, ptr6@GOTOFF(%eax)142; CHECK-I686:	movl	src6@GOTOFF(%eax), %ecx143; CHECK-I686:	movl	%ecx, dst6@GOTOFF(%eax)144; CHECK-I686:	ret145; CHECK-X32:	leal	dst6(%rip), %eax146; CHECK-X32:	movl	%eax, ptr6(%rip)147; CHECK-X32:	movl	src6(%rip), %eax148; CHECK-X32:	movl	%eax, dst6(%rip)149; CHECK-X32:	retq150}151 152 153;; Test constant pool references.154define double @test6(i32 %a.u) nounwind {155entry:156    %tmp = icmp eq i32 %a.u,0157    %retval = select i1 %tmp, double 4.561230e+02, double 1.234560e+02158    ret double %retval159 160; CHECK:	.LCPI6_0:161 162; CHECK-LABEL:	test6:163; CHECK-I686:	calll .L6$pb164; CHECK-I686:	.L6$pb:165; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L6$pb), 166; CHECK-I686:	fldl	.LCPI6_0@GOTOFF(167; CHECK-X32:		.LCPI6_0(%rip),168}169 170 171;; Test jump table references.172define void @test7(i32 %n.u) nounwind {173entry:174    switch i32 %n.u, label %bb12 [i32 1, label %bb i32 2, label %bb6 i32 4, label %bb7 i32 5, label %bb8 i32 6, label %bb10 i32 7, label %bb1 i32 8, label %bb3 i32 9, label %bb4 i32 10, label %bb9 i32 11, label %bb2 i32 12, label %bb5 i32 13, label %bb11 ]175bb:176    tail call void(...) @foo1()177    ret void178bb1:179    tail call void(...) @foo2()180    ret void181bb2:182    tail call void(...) @foo6()183    ret void184bb3:185    tail call void(...) @foo3()186    ret void187bb4:188    tail call void(...) @foo4()189    ret void190bb5:191    tail call void(...) @foo5()192    ret void193bb6:194    tail call void(...) @foo1()195    ret void196bb7:197    tail call void(...) @foo2()198    ret void199bb8:200    tail call void(...) @foo6()201    ret void202bb9:203    tail call void(...) @foo3()204    ret void205bb10:206    tail call void(...) @foo4()207    ret void208bb11:209    tail call void(...) @foo5()210    ret void211bb12:212    tail call void(...) @foo6()213    ret void214    215; CHECK-LABEL:	test7:216; CHECK-I686:	calll	.L7$pb217; CHECK-I686:	.L7$pb:218; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L7$pb),219; CHECK-I686:	.LJTI7_0@GOTOFF(220; CHECK-I686:	jmpl	*221; CHECK-X32:	leal	.LJTI7_0(%rip), %eax222; CHECK-X32:	addl	(%eax,%edi,4), %eax223; CHECK-X32:	jmpq	*%rax224 225; CHECK:	.p2align 2226; CHECK-NEXT:	.LJTI7_0:227; CHECK-I686:	.long	 .LBB7_2@GOTOFF228; CHECK-I686:	.long	 .LBB7_8@GOTOFF229; CHECK-I686:	.long	 .LBB7_4@GOTOFF230; CHECK-I686:	.long	 .LBB7_6@GOTOFF231; CHECK-I686:	.long	 .LBB7_5@GOTOFF232; CHECK-I686:	.long	 .LBB7_8@GOTOFF233; CHECK-I686:	.long	 .LBB7_7@GOTOFF234; CHECK-X32:	.long	.LBB7_2-.LJTI7_0235; CHECK-X32:	.long	.LBB7_2-.LJTI7_0236; CHECK-X32:	.long	.LBB7_12-.LJTI7_0237; CHECK-X32:	.long	.LBB7_5-.LJTI7_0238; CHECK-X32:	.long	.LBB7_12-.LJTI7_0239; CHECK-X32:	.long	.LBB7_9-.LJTI7_0240; CHECK-X32:	.long	.LBB7_5-.LJTI7_0241; CHECK-X32:	.long	.LBB7_8-.LJTI7_0242; CHECK-X32:	.long	.LBB7_9-.LJTI7_0243; CHECK-X32:	.long	.LBB7_8-.LJTI7_0244; CHECK-X32:	.long	.LBB7_12-.LJTI7_0245; CHECK-X32:	.long	.LBB7_3-.LJTI7_0246; CHECK-X32:	.long	.LBB7_3-.LJTI7_0247}248 249declare void @foo1(...)250declare void @foo2(...)251declare void @foo6(...)252declare void @foo3(...)253declare void @foo4(...)254declare void @foo5(...)255 256;; Check TLS references257@tlsptrgd = thread_local global ptr null258@tlsdstgd = thread_local global i32 0259@tlssrcgd = thread_local global i32 0260@tlsptrld = thread_local(localdynamic) global ptr null261@tlsdstld = thread_local(localdynamic) global i32 0262@tlssrcld = thread_local(localdynamic) global i32 0263@tlsptrie = thread_local(initialexec) global ptr null264@tlsdstie = thread_local(initialexec) global i32 0265@tlssrcie = thread_local(initialexec) global i32 0266@tlsptrle = thread_local(localexec) global ptr null267@tlsdstle = thread_local(localexec) global i32 0268@tlssrcle = thread_local(localexec) global i32 0269 270define void @test8() nounwind {271entry:272    store ptr @tlsdstgd, ptr @tlsptrgd273    %tmp.s = load i32, ptr @tlssrcgd274    store i32 %tmp.s, ptr @tlsdstgd275    ret void276 277; CHECK-LABEL:	test8:278; CHECK-I686:	calll	.L8$pb279; CHECK-I686-NEXT:	.L8$pb:280; CHECK-I686-NEXT:	popl281; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L8$pb), %ebx282; CHECK-I686-DAG:	leal	tlsdstgd@TLSGD(,%ebx), %eax283; CHECK-I686-DAG:	calll	___tls_get_addr@PLT284; CHECK-I686-DAG:	leal	tlsptrgd@TLSGD(,%ebx), %eax285; CHECK-I686-DAG:	calll	___tls_get_addr@PLT286; CHECK-I686-DAG:	leal	tlssrcgd@TLSGD(,%ebx), %eax287; CHECK-I686-DAG:	calll	___tls_get_addr@PLT288; CHECK-X32-NOT:	data16289; CHECK-X32-DAG:	leaq	tlsdstgd@TLSGD(%rip), %rdi290; CHECK-X32-DAG:	callq	__tls_get_addr@PLT291; CHECK-X32-DAG:	leaq	tlsptrgd@TLSGD(%rip), %rdi292; CHECK-X32-DAG:	callq	__tls_get_addr@PLT293; CHECK-X32-DAG:	leaq	tlssrcgd@TLSGD(%rip), %rdi294; CHECK-X32-DAG:	callq	__tls_get_addr@PLT295; CHECK-I686:	ret296; CHECK-X32:	retq297}298 299define void @test9() nounwind {300entry:301    store ptr @tlsdstld, ptr @tlsptrld302    %tmp.s = load i32, ptr @tlssrcld303    store i32 %tmp.s, ptr @tlsdstld304    ret void305 306; CHECK-LABEL:	test9:307; CHECK-I686:	calll	.L9$pb308; CHECK-I686-NEXT:	.L9$pb:309; CHECK-I686-NEXT:	popl310; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L9$pb), %ebx311; CHECK-I686:	leal	tlsdstld@TLSLDM(%ebx), %eax312; CHECK-X32:	leaq	tlsdstld@TLSLD(%rip), %rdi313; CHECK-I686:	calll	___tls_get_addr@PLT314; CHECK-X32:	callq	__tls_get_addr@PLT315; CHECK:	leal	tlsdstld@DTPOFF(316; CHECK:	movl	{{%.*}}, tlsptrld@DTPOFF(317; CHECK:	movl	tlssrcld@DTPOFF(318; CHECK:	movl	{{%.*}}, tlsdstld@DTPOFF(319; CHECK-I686:	ret320; CHECK-X32:	retq321}322 323define void @test10() nounwind {324entry:325    store ptr @tlsdstie, ptr @tlsptrie326    %tmp.s = load i32, ptr @tlssrcie327    store i32 %tmp.s, ptr @tlsdstie328    ret void329 330; CHECK-LABEL:	test10:331; CHECK-I686:	calll	.L10$pb332; CHECK-I686-NEXT:	.L10$pb:333; CHECK-I686-NEXT:	popl334; CHECK-I686:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L10$pb),335; CHECK-I686-DAG:	movl	tlsdstie@GOTNTPOFF(336; CHECK-I686-DAG:	movl	%gs:0,337; CHECK-X32-DAG:	movl	tlsdstie@GOTTPOFF(%rip),338; CHECK-X32-DAG:	movl	%fs:0,339; CHECK-I686:	addl340; CHECK-X32:	leal	({{%.*,%.*}}),341; CHECK-I686:	movl	tlsptrie@GOTNTPOFF(342; CHECK-X32:	movl	tlsptrie@GOTTPOFF(%rip),343; CHECK-I686:	movl	{{%.*}}, %gs:(344; CHECK-X32:	movl	{{%.*}}, ({{%.*,%.*}})345; CHECK-I686:	movl	tlssrcie@GOTNTPOFF(346; CHECK-X32:	movl	tlssrcie@GOTTPOFF(%rip),347; CHECK-I686:	movl	%gs:(348; CHECK-X32:	movl	({{%.*,%.*}}),349; CHECK-I686:	movl	{{%.*}}, %gs:(350; CHECK-X32:	movl	{{%.*}}, ({{%.*,%.*}})351; CHECK-I686:	ret352; CHECK-X32:	retq353}354 355define void @test11() nounwind {356entry:357    store ptr @tlsdstle, ptr @tlsptrle358    %tmp.s = load i32, ptr @tlssrcle359    store i32 %tmp.s, ptr @tlsdstle360    ret void361 362; CHECK-LABEL:	test11:363; CHECK-I686:	movl	%gs:0,364; CHECK-X32:	movl	%fs:0,365; CHECK-I686:	leal	tlsdstle@NTPOFF(366; CHECK-X32:	leal	tlsdstle@TPOFF(367; CHECK-I686:	movl	{{%.*}}, %gs:tlsptrle@NTPOFF368; CHECK-X32:	movl	{{%.*}}, %fs:tlsptrle@TPOFF369; CHECK-I686:	movl	%gs:tlssrcle@NTPOFF,370; CHECK-X32:	movl	%fs:tlssrcle@TPOFF,371; CHECK-I686:	movl	{{%.*}}, %gs:tlsdstle@NTPOFF372; CHECK-X32:	movl	{{%.*}}, %fs:tlsdstle@TPOFF373; CHECK-I686:	ret374; CHECK-X32:	retq375}376