1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky  | FileCheck %s
3; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -relocation-model=pic -code-model=small  | FileCheck %s --check-prefix=CHECK-PIC-SMALL
4; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -relocation-model=pic -code-model=large  | FileCheck %s --check-prefix=CHECK-PIC-LARGE
5
6@p_fun = global void (i32, i32)* @bar, align 8
7
8declare void @bar(i32, i32)
9
10define void @foo(i32 %a, i32* %ptr){
11; CHECK-LABEL: foo:
12; CHECK:       # %bb.0: # %entry
13; CHECK-NEXT:    subi16 sp, sp, 4
14; CHECK-NEXT:    .cfi_def_cfa_offset 4
15; CHECK-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
16; CHECK-NEXT:    .cfi_offset lr, -4
17; CHECK-NEXT:    subi16 sp, sp, 4
18; CHECK-NEXT:    .cfi_def_cfa_offset 8
19; CHECK-NEXT:    ld16.w a1, (a1, 0)
20; CHECK-NEXT:    lrw32 a2, [.LCPI0_0]
21; CHECK-NEXT:    jsr16 a2
22; CHECK-NEXT:    addi16 sp, sp, 4
23; CHECK-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
24; CHECK-NEXT:    addi16 sp, sp, 4
25; CHECK-NEXT:    rts16
26; CHECK-NEXT:    .p2align 1
27; CHECK-NEXT:  # %bb.1:
28; CHECK-NEXT:    .p2align 2
29; CHECK-NEXT:  .LCPI0_0:
30; CHECK-NEXT:    .long bar
31;
32; CHECK-PIC-SMALL-LABEL: foo:
33; CHECK-PIC-SMALL:       # %bb.0: # %entry
34; CHECK-PIC-SMALL-NEXT:    subi16 sp, sp, 8
35; CHECK-PIC-SMALL-NEXT:    .cfi_def_cfa_offset 8
36; CHECK-PIC-SMALL-NEXT:    st32.w rgb, (sp, 4) # 4-byte Folded Spill
37; CHECK-PIC-SMALL-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
38; CHECK-PIC-SMALL-NEXT:    .cfi_offset rgb, -4
39; CHECK-PIC-SMALL-NEXT:    .cfi_offset lr, -8
40; CHECK-PIC-SMALL-NEXT:    subi16 sp, sp, 4
41; CHECK-PIC-SMALL-NEXT:    .cfi_def_cfa_offset 12
42; CHECK-PIC-SMALL-NEXT:    lrw32 rgb, [.LCPI0_0]
43; CHECK-PIC-SMALL-NEXT:    mov32 a2, rgb
44; CHECK-PIC-SMALL-NEXT:    ld16.w a1, (a1, 0)
45; CHECK-PIC-SMALL-NEXT:    lrw32 a3, [.LCPI0_1]
46; CHECK-PIC-SMALL-NEXT:    addu16 a2, a2, a3
47; CHECK-PIC-SMALL-NEXT:    ld16.w a2, (a2, 0)
48; CHECK-PIC-SMALL-NEXT:    jsr16 a2
49; CHECK-PIC-SMALL-NEXT:    addi16 sp, sp, 4
50; CHECK-PIC-SMALL-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
51; CHECK-PIC-SMALL-NEXT:    ld32.w rgb, (sp, 4) # 4-byte Folded Reload
52; CHECK-PIC-SMALL-NEXT:    addi16 sp, sp, 8
53; CHECK-PIC-SMALL-NEXT:    rts16
54; CHECK-PIC-SMALL-NEXT:    .p2align 1
55; CHECK-PIC-SMALL-NEXT:  # %bb.1:
56; CHECK-PIC-SMALL-NEXT:    .p2align 2
57; CHECK-PIC-SMALL-NEXT:  .LCPI0_0:
58; CHECK-PIC-SMALL-NEXT:    .long _GLOBAL_OFFSET_TABLE_
59; CHECK-PIC-SMALL-NEXT:  .LCPI0_1:
60; CHECK-PIC-SMALL-NEXT:    .long bar@PLT
61;
62; CHECK-PIC-LARGE-LABEL: foo:
63; CHECK-PIC-LARGE:       # %bb.0: # %entry
64; CHECK-PIC-LARGE-NEXT:    subi16 sp, sp, 8
65; CHECK-PIC-LARGE-NEXT:    .cfi_def_cfa_offset 8
66; CHECK-PIC-LARGE-NEXT:    st32.w rgb, (sp, 4) # 4-byte Folded Spill
67; CHECK-PIC-LARGE-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
68; CHECK-PIC-LARGE-NEXT:    .cfi_offset rgb, -4
69; CHECK-PIC-LARGE-NEXT:    .cfi_offset lr, -8
70; CHECK-PIC-LARGE-NEXT:    subi16 sp, sp, 4
71; CHECK-PIC-LARGE-NEXT:    .cfi_def_cfa_offset 12
72; CHECK-PIC-LARGE-NEXT:    lrw32 rgb, [.LCPI0_0]
73; CHECK-PIC-LARGE-NEXT:    mov32 a2, rgb
74; CHECK-PIC-LARGE-NEXT:    ld16.w a1, (a1, 0)
75; CHECK-PIC-LARGE-NEXT:    lrw32 a3, [.LCPI0_1]
76; CHECK-PIC-LARGE-NEXT:    addu16 a2, a2, a3
77; CHECK-PIC-LARGE-NEXT:    ld16.w a2, (a2, 0)
78; CHECK-PIC-LARGE-NEXT:    jsr16 a2
79; CHECK-PIC-LARGE-NEXT:    addi16 sp, sp, 4
80; CHECK-PIC-LARGE-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
81; CHECK-PIC-LARGE-NEXT:    ld32.w rgb, (sp, 4) # 4-byte Folded Reload
82; CHECK-PIC-LARGE-NEXT:    addi16 sp, sp, 8
83; CHECK-PIC-LARGE-NEXT:    rts16
84; CHECK-PIC-LARGE-NEXT:    .p2align 1
85; CHECK-PIC-LARGE-NEXT:  # %bb.1:
86; CHECK-PIC-LARGE-NEXT:    .p2align 2
87; CHECK-PIC-LARGE-NEXT:  .LCPI0_0:
88; CHECK-PIC-LARGE-NEXT:    .long _GLOBAL_OFFSET_TABLE_
89; CHECK-PIC-LARGE-NEXT:  .LCPI0_1:
90; CHECK-PIC-LARGE-NEXT:    .long bar@PLT
91; CHECK-PIC-LABEL: foo:
92; CHECK-PIC:       # %bb.0: # %entry
93; CHECK-PIC-NEXT:    ld32.w a1, a1, 0
94; CHECK-PIC-NEXT:    br32 bar
95entry:
96  %0 = load i32, i32* %ptr
97  tail call void (i32, i32) @bar(i32 %a, i32 %0)
98  ret void
99}
100
101define void @foo_indirect(i32 %a, i32* %ptr) {
102; CHECK-LABEL: foo_indirect:
103; CHECK:       # %bb.0: # %entry
104; CHECK-NEXT:    subi16 sp, sp, 4
105; CHECK-NEXT:    .cfi_def_cfa_offset 4
106; CHECK-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
107; CHECK-NEXT:    .cfi_offset lr, -4
108; CHECK-NEXT:    subi16 sp, sp, 4
109; CHECK-NEXT:    .cfi_def_cfa_offset 8
110; CHECK-NEXT:    lrw32 a2, [.LCPI1_0]
111; CHECK-NEXT:    ld16.w a2, (a2, 0)
112; CHECK-NEXT:    ld16.w a1, (a1, 0)
113; CHECK-NEXT:    jsr16 a2
114; CHECK-NEXT:    addi16 sp, sp, 4
115; CHECK-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
116; CHECK-NEXT:    addi16 sp, sp, 4
117; CHECK-NEXT:    rts16
118; CHECK-NEXT:    .p2align 1
119; CHECK-NEXT:  # %bb.1:
120; CHECK-NEXT:    .p2align 2
121; CHECK-NEXT:  .LCPI1_0:
122; CHECK-NEXT:    .long p_fun
123;
124; CHECK-PIC-SMALL-LABEL: foo_indirect:
125; CHECK-PIC-SMALL:       # %bb.0: # %entry
126; CHECK-PIC-SMALL-NEXT:    subi16 sp, sp, 8
127; CHECK-PIC-SMALL-NEXT:    .cfi_def_cfa_offset 8
128; CHECK-PIC-SMALL-NEXT:    st32.w rgb, (sp, 4) # 4-byte Folded Spill
129; CHECK-PIC-SMALL-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
130; CHECK-PIC-SMALL-NEXT:    .cfi_offset rgb, -4
131; CHECK-PIC-SMALL-NEXT:    .cfi_offset lr, -8
132; CHECK-PIC-SMALL-NEXT:    subi16 sp, sp, 4
133; CHECK-PIC-SMALL-NEXT:    .cfi_def_cfa_offset 12
134; CHECK-PIC-SMALL-NEXT:    lrw32 rgb, [.LCPI1_0]
135; CHECK-PIC-SMALL-NEXT:    mov32 a2, rgb
136; CHECK-PIC-SMALL-NEXT:    lrw32 a3, [.LCPI1_1]
137; CHECK-PIC-SMALL-NEXT:    addu16 a2, a2, a3
138; CHECK-PIC-SMALL-NEXT:    ld16.w a2, (a2, 0)
139; CHECK-PIC-SMALL-NEXT:    ld16.w a2, (a2, 0)
140; CHECK-PIC-SMALL-NEXT:    ld16.w a1, (a1, 0)
141; CHECK-PIC-SMALL-NEXT:    jsr16 a2
142; CHECK-PIC-SMALL-NEXT:    addi16 sp, sp, 4
143; CHECK-PIC-SMALL-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
144; CHECK-PIC-SMALL-NEXT:    ld32.w rgb, (sp, 4) # 4-byte Folded Reload
145; CHECK-PIC-SMALL-NEXT:    addi16 sp, sp, 8
146; CHECK-PIC-SMALL-NEXT:    rts16
147; CHECK-PIC-SMALL-NEXT:    .p2align 1
148; CHECK-PIC-SMALL-NEXT:  # %bb.1:
149; CHECK-PIC-SMALL-NEXT:    .p2align 2
150; CHECK-PIC-SMALL-NEXT:  .LCPI1_0:
151; CHECK-PIC-SMALL-NEXT:    .long _GLOBAL_OFFSET_TABLE_
152; CHECK-PIC-SMALL-NEXT:  .LCPI1_1:
153; CHECK-PIC-SMALL-NEXT:    .long p_fun@GOT
154;
155; CHECK-PIC-LARGE-LABEL: foo_indirect:
156; CHECK-PIC-LARGE:       # %bb.0: # %entry
157; CHECK-PIC-LARGE-NEXT:    subi16 sp, sp, 8
158; CHECK-PIC-LARGE-NEXT:    .cfi_def_cfa_offset 8
159; CHECK-PIC-LARGE-NEXT:    st32.w rgb, (sp, 4) # 4-byte Folded Spill
160; CHECK-PIC-LARGE-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
161; CHECK-PIC-LARGE-NEXT:    .cfi_offset rgb, -4
162; CHECK-PIC-LARGE-NEXT:    .cfi_offset lr, -8
163; CHECK-PIC-LARGE-NEXT:    subi16 sp, sp, 4
164; CHECK-PIC-LARGE-NEXT:    .cfi_def_cfa_offset 12
165; CHECK-PIC-LARGE-NEXT:    lrw32 rgb, [.LCPI1_0]
166; CHECK-PIC-LARGE-NEXT:    mov32 a2, rgb
167; CHECK-PIC-LARGE-NEXT:    lrw32 a3, [.LCPI1_1]
168; CHECK-PIC-LARGE-NEXT:    addu16 a2, a2, a3
169; CHECK-PIC-LARGE-NEXT:    ld16.w a2, (a2, 0)
170; CHECK-PIC-LARGE-NEXT:    ld16.w a2, (a2, 0)
171; CHECK-PIC-LARGE-NEXT:    ld16.w a1, (a1, 0)
172; CHECK-PIC-LARGE-NEXT:    jsr16 a2
173; CHECK-PIC-LARGE-NEXT:    addi16 sp, sp, 4
174; CHECK-PIC-LARGE-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
175; CHECK-PIC-LARGE-NEXT:    ld32.w rgb, (sp, 4) # 4-byte Folded Reload
176; CHECK-PIC-LARGE-NEXT:    addi16 sp, sp, 8
177; CHECK-PIC-LARGE-NEXT:    rts16
178; CHECK-PIC-LARGE-NEXT:    .p2align 1
179; CHECK-PIC-LARGE-NEXT:  # %bb.1:
180; CHECK-PIC-LARGE-NEXT:    .p2align 2
181; CHECK-PIC-LARGE-NEXT:  .LCPI1_0:
182; CHECK-PIC-LARGE-NEXT:    .long _GLOBAL_OFFSET_TABLE_
183; CHECK-PIC-LARGE-NEXT:  .LCPI1_1:
184; CHECK-PIC-LARGE-NEXT:    .long p_fun@GOT
185; CHECK-PIC-LABEL: foo_indirect:
186; CHECK-PIC:       # %bb.0: # %entry
187; CHECK-PIC-NEXT:    movi32 a2, p_fun
188; CHECK-PIC-NEXT:    movih32 a3, p_fun
189; CHECK-PIC-NEXT:    or32 a2, a3, a2
190; CHECK-PIC-NEXT:    ld32.w a2, a2, 0
191; CHECK-PIC-NEXT:    ld32.w a1, a1, 0
192; CHECK-PIC-NEXT:    jmp32 a2
193entry:
194  %0 = load void (i32, i32)*, void (i32, i32)** @p_fun, align 8
195  %1 = load i32, i32* %ptr
196  tail call void (i32, i32) %0(i32 %a, i32 %1)
197  ret void
198}
199