xref: /llvm-project/llvm/test/CodeGen/LoongArch/code-models.ll (revision 6377ae46a83e52fe1850a42ce8e1ee3e840243ba)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=small < %s | \
3; RUN:    FileCheck --check-prefix=SMALL %s
4; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium < %s | \
5; RUN:    FileCheck --check-prefix=MEDIUM %s
6; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large < %s | \
7; RUN:    FileCheck --check-prefix=LARGE %s
8
9declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
10declare i32 @callee(i32)
11
12define i32 @call_globaladdress(i32 %a) nounwind {
13; SMALL-LABEL: call_globaladdress:
14; SMALL:       # %bb.0:
15; SMALL-NEXT:    addi.d $sp, $sp, -16
16; SMALL-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
17; SMALL-NEXT:    bl %plt(callee)
18; SMALL-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
19; SMALL-NEXT:    addi.d $sp, $sp, 16
20; SMALL-NEXT:    ret
21;
22; MEDIUM-LABEL: call_globaladdress:
23; MEDIUM:       # %bb.0:
24; MEDIUM-NEXT:    addi.d $sp, $sp, -16
25; MEDIUM-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
26; MEDIUM-NEXT:    pcaddu18i $ra, %call36(callee)
27; MEDIUM-NEXT:    jirl $ra, $ra, 0
28; MEDIUM-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
29; MEDIUM-NEXT:    addi.d $sp, $sp, 16
30; MEDIUM-NEXT:    ret
31;
32; LARGE-LABEL: call_globaladdress:
33; LARGE:       # %bb.0:
34; LARGE-NEXT:    addi.d $sp, $sp, -16
35; LARGE-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
36; LARGE-NEXT:    pcalau12i $a1, %got_pc_hi20(callee)
37; LARGE-NEXT:    addi.d $ra, $zero, %got_pc_lo12(callee)
38; LARGE-NEXT:    lu32i.d $ra, %got64_pc_lo20(callee)
39; LARGE-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(callee)
40; LARGE-NEXT:    ldx.d $ra, $ra, $a1
41; LARGE-NEXT:    jirl $ra, $ra, 0
42; LARGE-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
43; LARGE-NEXT:    addi.d $sp, $sp, 16
44; LARGE-NEXT:    ret
45  %1 = call i32 @callee(i32 %a)
46  ret i32 %1
47}
48
49define void @call_external_sym(ptr %dst) {
50; SMALL-LABEL: call_external_sym:
51; SMALL:       # %bb.0: # %entry
52; SMALL-NEXT:    addi.d $sp, $sp, -16
53; SMALL-NEXT:    .cfi_def_cfa_offset 16
54; SMALL-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
55; SMALL-NEXT:    .cfi_offset 1, -8
56; SMALL-NEXT:    ori $a2, $zero, 1000
57; SMALL-NEXT:    move $a1, $zero
58; SMALL-NEXT:    bl %plt(memset)
59; SMALL-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
60; SMALL-NEXT:    addi.d $sp, $sp, 16
61; SMALL-NEXT:    ret
62;
63; MEDIUM-LABEL: call_external_sym:
64; MEDIUM:       # %bb.0: # %entry
65; MEDIUM-NEXT:    addi.d $sp, $sp, -16
66; MEDIUM-NEXT:    .cfi_def_cfa_offset 16
67; MEDIUM-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
68; MEDIUM-NEXT:    .cfi_offset 1, -8
69; MEDIUM-NEXT:    ori $a2, $zero, 1000
70; MEDIUM-NEXT:    move $a1, $zero
71; MEDIUM-NEXT:    pcaddu18i $ra, %call36(memset)
72; MEDIUM-NEXT:    jirl $ra, $ra, 0
73; MEDIUM-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
74; MEDIUM-NEXT:    addi.d $sp, $sp, 16
75; MEDIUM-NEXT:    ret
76;
77; LARGE-LABEL: call_external_sym:
78; LARGE:       # %bb.0: # %entry
79; LARGE-NEXT:    addi.d $sp, $sp, -16
80; LARGE-NEXT:    .cfi_def_cfa_offset 16
81; LARGE-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
82; LARGE-NEXT:    .cfi_offset 1, -8
83; LARGE-NEXT:    ori $a2, $zero, 1000
84; LARGE-NEXT:    move $a1, $zero
85; LARGE-NEXT:    pcalau12i $a3, %got_pc_hi20(memset)
86; LARGE-NEXT:    addi.d $ra, $zero, %got_pc_lo12(memset)
87; LARGE-NEXT:    lu32i.d $ra, %got64_pc_lo20(memset)
88; LARGE-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(memset)
89; LARGE-NEXT:    ldx.d $ra, $ra, $a3
90; LARGE-NEXT:    jirl $ra, $ra, 0
91; LARGE-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
92; LARGE-NEXT:    addi.d $sp, $sp, 16
93; LARGE-NEXT:    ret
94entry:
95  call void @llvm.memset.p0.i64(ptr %dst, i8 0, i64 1000, i1 false)
96  ret void
97}
98
99;; Tail call with different codemodel.
100declare i32 @callee_tail(i32 %i)
101define i32 @caller_tail(i32 %i) nounwind {
102; SMALL-LABEL: caller_tail:
103; SMALL:       # %bb.0: # %entry
104; SMALL-NEXT:    b %plt(callee_tail)
105;
106; MEDIUM-LABEL: caller_tail:
107; MEDIUM:       # %bb.0: # %entry
108; MEDIUM-NEXT:    pcaddu18i $t8, %call36(callee_tail)
109; MEDIUM-NEXT:    jr $t8
110;
111; LARGE-LABEL: caller_tail:
112; LARGE:       # %bb.0: # %entry
113; LARGE-NEXT:    pcalau12i $a1, %got_pc_hi20(callee_tail)
114; LARGE-NEXT:    addi.d $a2, $zero, %got_pc_lo12(callee_tail)
115; LARGE-NEXT:    lu32i.d $a2, %got64_pc_lo20(callee_tail)
116; LARGE-NEXT:    lu52i.d $a2, $a2, %got64_pc_hi12(callee_tail)
117; LARGE-NEXT:    ldx.d $a1, $a2, $a1
118; LARGE-NEXT:    jr $a1
119entry:
120  %r = tail call i32 @callee_tail(i32 %i)
121  ret i32 %r
122}
123