1; RUN: llc --mtriple=loongarch32 < %s | FileCheck --check-prefix=LA32 %s
2; RUN: llc --mtriple=loongarch64 < %s | FileCheck --check-prefix=LA64 %s
3
4declare i32 @external_function(i32)
5
6define i32 @test_call_external(i32 %a) nounwind {
7; LA32-LABEL: test_call_external:
8; LA32:       # %bb.0:
9; LA32-NEXT:    addi.w $sp, $sp, -16
10; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
11; LA32-NEXT:    bl external_function
12; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
13; LA32-NEXT:    addi.w $sp, $sp, 16
14; LA32-NEXT:    jirl $zero, $ra, 0
15;
16; LA64-LABEL: test_call_external:
17; LA64:       # %bb.0:
18; LA64-NEXT:    addi.d $sp, $sp, -16
19; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
20; LA64-NEXT:    bl external_function
21; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
22; LA64-NEXT:    addi.d $sp, $sp, 16
23; LA64-NEXT:    jirl $zero, $ra, 0
24  %1 = call i32 @external_function(i32 %a)
25  ret i32 %1
26}
27
28define i32 @defined_function(i32 %a) nounwind {
29; LA32-LABEL: defined_function:
30; LA32:       # %bb.0:
31; LA32-NEXT:    addi.w $a0, $a0, 1
32; LA32-NEXT:    jirl $zero, $ra, 0
33;
34; LA64-LABEL: defined_function:
35; LA64:       # %bb.0:
36; LA64-NEXT:    addi.d $a0, $a0, 1
37; LA64-NEXT:    jirl $zero, $ra, 0
38  %1 = add i32 %a, 1
39  ret i32 %1
40}
41
42define i32 @test_call_defined(i32 %a) nounwind {
43; LA32-LABEL: test_call_defined:
44; LA32:       # %bb.0:
45; LA32-NEXT:    addi.w $sp, $sp, -16
46; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
47; LA32-NEXT:    bl defined_function
48; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
49; LA32-NEXT:    addi.w $sp, $sp, 16
50; LA32-NEXT:    jirl $zero, $ra, 0
51;
52; LA64-LABEL: test_call_defined:
53; LA64:       # %bb.0:
54; LA64-NEXT:    addi.d $sp, $sp, -16
55; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
56; LA64-NEXT:    bl defined_function
57; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
58; LA64-NEXT:    addi.d $sp, $sp, 16
59; LA64-NEXT:    jirl $zero, $ra, 0
60  %1 = call i32 @defined_function(i32 %a) nounwind
61  ret i32 %1
62}
63
64define i32 @test_call_indirect(ptr %a, i32 %b) nounwind {
65; LA32-LABEL: test_call_indirect:
66; LA32:       # %bb.0:
67; LA32-NEXT:    addi.w $sp, $sp, -16
68; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
69; LA32-NEXT:    move $a2, $a0
70; LA32-NEXT:    move $a0, $a1
71; LA32-NEXT:    jirl $ra, $a2, 0
72; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
73; LA32-NEXT:    addi.w $sp, $sp, 16
74; LA32-NEXT:    jirl $zero, $ra, 0
75;
76; LA64-LABEL: test_call_indirect:
77; LA64:       # %bb.0:
78; LA64-NEXT:    addi.d $sp, $sp, -16
79; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
80; LA64-NEXT:    move $a2, $a0
81; LA64-NEXT:    move $a0, $a1
82; LA64-NEXT:    jirl $ra, $a2, 0
83; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
84; LA64-NEXT:    addi.d $sp, $sp, 16
85; LA64-NEXT:    jirl $zero, $ra, 0
86  %1 = call i32 %a(i32 %b)
87  ret i32 %1
88}
89