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