xref: /llvm-project/llvm/test/CodeGen/M68k/CodeModel/Large/large-pic.ll (revision 4cce10743d2275710d3d2e0de8013386a9799092)
1*4cce1074Sknickish; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*4cce1074Sknickish; RUN: llc < %s -O2 -mtriple=m68k -verify-machineinstrs \
3*4cce1074Sknickish; RUN:              -code-model=large -relocation-model=pic \
4*4cce1074Sknickish; RUN:   | FileCheck %s
5*4cce1074Sknickish
6*4cce1074Sknickish@ptr = external global ptr
7*4cce1074Sknickish@dst = external global i32
8*4cce1074Sknickish@src = external global i32
9*4cce1074Sknickish
10*4cce1074Sknickishdefine void @test0() nounwind {
11*4cce1074Sknickish; CHECK-LABEL: test0:
12*4cce1074Sknickish; CHECK:       ; %bb.0: ; %entry
13*4cce1074Sknickish; CHECK-NEXT:    lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
14*4cce1074Sknickish; CHECK-NEXT:    move.l %a0, %a1
15*4cce1074Sknickish; CHECK-NEXT:    adda.l #dst@GOTOFF, %a1
16*4cce1074Sknickish; CHECK-NEXT:    move.l #ptr@GOTOFF, %d0
17*4cce1074Sknickish; CHECK-NEXT:    move.l %a1, (0,%a0,%d0)
18*4cce1074Sknickish; CHECK-NEXT:    move.l #src@GOTOFF, %d0
19*4cce1074Sknickish; CHECK-NEXT:    move.l #dst@GOTOFF, %d1
20*4cce1074Sknickish; CHECK-NEXT:    move.l (0,%a0,%d0), (0,%a0,%d1)
21*4cce1074Sknickish; CHECK-NEXT:    rts
22*4cce1074Sknickishentry:
23*4cce1074Sknickish    store ptr @dst, ptr @ptr
24*4cce1074Sknickish    %tmp.s = load i32, ptr @src
25*4cce1074Sknickish    store i32 %tmp.s, ptr @dst
26*4cce1074Sknickish    ret void
27*4cce1074Sknickish}
28*4cce1074Sknickish
29*4cce1074Sknickish@ptr2 = global ptr null
30*4cce1074Sknickish@dst2 = global i32 0
31*4cce1074Sknickish@src2 = global i32 0
32*4cce1074Sknickish
33*4cce1074Sknickishdefine void @test1() nounwind {
34*4cce1074Sknickish; CHECK-LABEL: test1:
35*4cce1074Sknickish; CHECK:       ; %bb.0: ; %entry
36*4cce1074Sknickish; CHECK-NEXT:    lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
37*4cce1074Sknickish; CHECK-NEXT:    move.l %a0, %a1
38*4cce1074Sknickish; CHECK-NEXT:    adda.l #dst2@GOTOFF, %a1
39*4cce1074Sknickish; CHECK-NEXT:    move.l #ptr2@GOTOFF, %d0
40*4cce1074Sknickish; CHECK-NEXT:    move.l %a1, (0,%a0,%d0)
41*4cce1074Sknickish; CHECK-NEXT:    move.l #src2@GOTOFF, %d0
42*4cce1074Sknickish; CHECK-NEXT:    move.l #dst2@GOTOFF, %d1
43*4cce1074Sknickish; CHECK-NEXT:    move.l (0,%a0,%d0), (0,%a0,%d1)
44*4cce1074Sknickish; CHECK-NEXT:    rts
45*4cce1074Sknickishentry:
46*4cce1074Sknickish    store ptr @dst2, ptr @ptr2
47*4cce1074Sknickish    %tmp.s = load i32, ptr @src2
48*4cce1074Sknickish    store i32 %tmp.s, ptr @dst2
49*4cce1074Sknickish    ret void
50*4cce1074Sknickish}
51*4cce1074Sknickish
52*4cce1074Sknickishdeclare ptr @malloc(i32)
53*4cce1074Sknickish
54*4cce1074Sknickishdefine void @test2() nounwind {
55*4cce1074Sknickish; CHECK-LABEL: test2:
56*4cce1074Sknickish; CHECK:       ; %bb.0: ; %entry
57*4cce1074Sknickish; CHECK-NEXT:    suba.l #4, %sp
58*4cce1074Sknickish; CHECK-NEXT:    move.l #40, (%sp)
59*4cce1074Sknickish; CHECK-NEXT:    jsr (malloc@PLT,%pc)
60*4cce1074Sknickish; CHECK-NEXT:    adda.l #4, %sp
61*4cce1074Sknickish; CHECK-NEXT:    rts
62*4cce1074Sknickishentry:
63*4cce1074Sknickish    %ptr = call ptr @malloc(i32 40)
64*4cce1074Sknickish    ret void
65*4cce1074Sknickish}
66*4cce1074Sknickish
67*4cce1074Sknickish@pfoo = external global ptr
68*4cce1074Sknickishdeclare ptr @afoo(...)
69*4cce1074Sknickish
70*4cce1074Sknickishdefine void @test3() nounwind {
71*4cce1074Sknickish; CHECK-LABEL: test3:
72*4cce1074Sknickish; CHECK:       ; %bb.0: ; %entry
73*4cce1074Sknickish; CHECK-NEXT:    suba.l #4, %sp
74*4cce1074Sknickish; CHECK-NEXT:    movem.l %a2, (0,%sp) ; 8-byte Folded Spill
75*4cce1074Sknickish; CHECK-NEXT:    lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a2
76*4cce1074Sknickish; CHECK-NEXT:    jsr (afoo@PLT,%pc)
77*4cce1074Sknickish; CHECK-NEXT:    move.l #pfoo@GOTOFF, %d0
78*4cce1074Sknickish; CHECK-NEXT:    move.l %a0, (0,%a2,%d0)
79*4cce1074Sknickish; CHECK-NEXT:    jsr (%a0)
80*4cce1074Sknickish; CHECK-NEXT:    movem.l (0,%sp), %a2 ; 8-byte Folded Reload
81*4cce1074Sknickish; CHECK-NEXT:    adda.l #4, %sp
82*4cce1074Sknickish; CHECK-NEXT:    rts
83*4cce1074Sknickishentry:
84*4cce1074Sknickish    %tmp = call ptr(...) @afoo()
85*4cce1074Sknickish    store ptr %tmp, ptr @pfoo
86*4cce1074Sknickish    %tmp1 = load ptr, ptr @pfoo
87*4cce1074Sknickish    call void(...) %tmp1()
88*4cce1074Sknickish    ret void
89*4cce1074Sknickish}
90*4cce1074Sknickish
91*4cce1074Sknickishdeclare void @foo(...)
92*4cce1074Sknickish
93*4cce1074Sknickishdefine void @test4() nounwind {
94*4cce1074Sknickish; CHECK-LABEL: test4:
95*4cce1074Sknickish; CHECK:       ; %bb.0: ; %entry
96*4cce1074Sknickish; CHECK-NEXT:    suba.l #4, %sp
97*4cce1074Sknickish; CHECK-NEXT:    jsr (foo@PLT,%pc)
98*4cce1074Sknickish; CHECK-NEXT:    adda.l #4, %sp
99*4cce1074Sknickish; CHECK-NEXT:    rts
100*4cce1074Sknickishentry:
101*4cce1074Sknickish    call void(...) @foo()
102*4cce1074Sknickish    ret void
103*4cce1074Sknickish}
104*4cce1074Sknickish
105*4cce1074Sknickish@ptr6 = internal global ptr null
106*4cce1074Sknickish@dst6 = internal global i32 0
107*4cce1074Sknickish@src6 = internal global i32 0
108*4cce1074Sknickish
109*4cce1074Sknickishdefine void @test5() nounwind {
110*4cce1074Sknickish; CHECK-LABEL: test5:
111*4cce1074Sknickish; CHECK:       ; %bb.0: ; %entry
112*4cce1074Sknickish; CHECK-NEXT:    lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
113*4cce1074Sknickish; CHECK-NEXT:    move.l %a0, %a1
114*4cce1074Sknickish; CHECK-NEXT:    adda.l #dst6@GOTOFF, %a1
115*4cce1074Sknickish; CHECK-NEXT:    move.l #ptr6@GOTOFF, %d0
116*4cce1074Sknickish; CHECK-NEXT:    move.l %a1, (0,%a0,%d0)
117*4cce1074Sknickish; CHECK-NEXT:    move.l #src6@GOTOFF, %d0
118*4cce1074Sknickish; CHECK-NEXT:    move.l #dst6@GOTOFF, %d1
119*4cce1074Sknickish; CHECK-NEXT:    move.l (0,%a0,%d0), (0,%a0,%d1)
120*4cce1074Sknickish; CHECK-NEXT:    rts
121*4cce1074Sknickishentry:
122*4cce1074Sknickish    store ptr @dst6, ptr @ptr6
123*4cce1074Sknickish    %tmp.s = load i32, ptr @src6
124*4cce1074Sknickish    store i32 %tmp.s, ptr @dst6
125*4cce1074Sknickish    ret void
126*4cce1074Sknickish}
127*4cce1074Sknickish
128*4cce1074Sknickishdefine void @test7(i32 %n.u) nounwind {
129*4cce1074Sknickish; CHECK-LABEL: test7:
130*4cce1074Sknickish; CHECK:       ; %bb.0: ; %entry
131*4cce1074Sknickish; CHECK-NEXT:    move.l (4,%sp), %d0
132*4cce1074Sknickish; CHECK-NEXT:    add.l #-1, %d0
133*4cce1074Sknickish; CHECK-NEXT:    move.l %d0, %d1
134*4cce1074Sknickish; CHECK-NEXT:    sub.l #12, %d1
135*4cce1074Sknickish; CHECK-NEXT:    bhi .LBB6_12
136*4cce1074Sknickish; CHECK-NEXT:  ; %bb.1: ; %entry
137*4cce1074Sknickish; CHECK-NEXT:    lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
138*4cce1074Sknickish; CHECK-NEXT:    lsl.l #2, %d0
139*4cce1074Sknickish; CHECK-NEXT:    move.l %a0, %a1
140*4cce1074Sknickish; CHECK-NEXT:    adda.l #.LJTI6_0@GOTOFF, %a1
141*4cce1074Sknickish; CHECK-NEXT:    move.l %a0, %d1
142*4cce1074Sknickish; CHECK-NEXT:    add.l (0,%a1,%d0), %d1
143*4cce1074Sknickish; CHECK-NEXT:    move.l %d1, %a0
144*4cce1074Sknickish; CHECK-NEXT:    jmp (%a0)
145*4cce1074Sknickish; CHECK-NEXT:  .LBB6_12: ; %bb2
146*4cce1074Sknickish; CHECK-NEXT:    bra foo6@PLT ; TAILCALL
147*4cce1074Sknickish; CHECK-NEXT:  .LBB6_3: ; %bb5
148*4cce1074Sknickish; CHECK-NEXT:    bra foo5@PLT ; TAILCALL
149*4cce1074Sknickish; CHECK-NEXT:  .LBB6_5: ; %bb1
150*4cce1074Sknickish; CHECK-NEXT:    bra foo2@PLT ; TAILCALL
151*4cce1074Sknickish; CHECK-NEXT:  .LBB6_2: ; %bb
152*4cce1074Sknickish; CHECK-NEXT:    bra foo1@PLT ; TAILCALL
153*4cce1074Sknickish; CHECK-NEXT:  .LBB6_9: ; %bb4
154*4cce1074Sknickish; CHECK-NEXT:    bra foo4@PLT ; TAILCALL
155*4cce1074Sknickish; CHECK-NEXT:  .LBB6_8: ; %bb3
156*4cce1074Sknickish; CHECK-NEXT:    bra foo3@PLT ; TAILCALL
157*4cce1074Sknickishentry:
158*4cce1074Sknickish    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 ]
159*4cce1074Sknickishbb:
160*4cce1074Sknickish    tail call void(...) @foo1()
161*4cce1074Sknickish    ret void
162*4cce1074Sknickishbb1:
163*4cce1074Sknickish    tail call void(...) @foo2()
164*4cce1074Sknickish    ret void
165*4cce1074Sknickishbb2:
166*4cce1074Sknickish    tail call void(...) @foo6()
167*4cce1074Sknickish    ret void
168*4cce1074Sknickishbb3:
169*4cce1074Sknickish    tail call void(...) @foo3()
170*4cce1074Sknickish    ret void
171*4cce1074Sknickishbb4:
172*4cce1074Sknickish    tail call void(...) @foo4()
173*4cce1074Sknickish    ret void
174*4cce1074Sknickishbb5:
175*4cce1074Sknickish    tail call void(...) @foo5()
176*4cce1074Sknickish    ret void
177*4cce1074Sknickishbb6:
178*4cce1074Sknickish    tail call void(...) @foo1()
179*4cce1074Sknickish    ret void
180*4cce1074Sknickishbb7:
181*4cce1074Sknickish    tail call void(...) @foo2()
182*4cce1074Sknickish    ret void
183*4cce1074Sknickishbb8:
184*4cce1074Sknickish    tail call void(...) @foo6()
185*4cce1074Sknickish    ret void
186*4cce1074Sknickishbb9:
187*4cce1074Sknickish    tail call void(...) @foo3()
188*4cce1074Sknickish    ret void
189*4cce1074Sknickishbb10:
190*4cce1074Sknickish    tail call void(...) @foo4()
191*4cce1074Sknickish    ret void
192*4cce1074Sknickishbb11:
193*4cce1074Sknickish    tail call void(...) @foo5()
194*4cce1074Sknickish    ret void
195*4cce1074Sknickishbb12:
196*4cce1074Sknickish    tail call void(...) @foo6()
197*4cce1074Sknickish    ret void
198*4cce1074Sknickish}
199*4cce1074Sknickish
200*4cce1074Sknickishdeclare void @foo1(...)
201*4cce1074Sknickishdeclare void @foo2(...)
202*4cce1074Sknickishdeclare void @foo6(...)
203*4cce1074Sknickishdeclare void @foo3(...)
204*4cce1074Sknickishdeclare void @foo4(...)
205*4cce1074Sknickishdeclare void @foo5(...)
206