xref: /llvm-project/llvm/test/CodeGen/LoongArch/code-models.ll (revision 6377ae46a83e52fe1850a42ce8e1ee3e840243ba)
100786d3aSWANG Xuerui; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
29d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=small < %s | \
300786d3aSWANG Xuerui; RUN:    FileCheck --check-prefix=SMALL %s
49d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium < %s | \
500786d3aSWANG Xuerui; RUN:    FileCheck --check-prefix=MEDIUM %s
69d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large < %s | \
700786d3aSWANG Xuerui; RUN:    FileCheck --check-prefix=LARGE %s
800786d3aSWANG Xuerui
900786d3aSWANG Xueruideclare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
1000786d3aSWANG Xueruideclare i32 @callee(i32)
1100786d3aSWANG Xuerui
1200786d3aSWANG Xueruidefine i32 @call_globaladdress(i32 %a) nounwind {
1300786d3aSWANG Xuerui; SMALL-LABEL: call_globaladdress:
1400786d3aSWANG Xuerui; SMALL:       # %bb.0:
1500786d3aSWANG Xuerui; SMALL-NEXT:    addi.d $sp, $sp, -16
1600786d3aSWANG Xuerui; SMALL-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
1700786d3aSWANG Xuerui; SMALL-NEXT:    bl %plt(callee)
1800786d3aSWANG Xuerui; SMALL-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
1900786d3aSWANG Xuerui; SMALL-NEXT:    addi.d $sp, $sp, 16
2000786d3aSWANG Xuerui; SMALL-NEXT:    ret
2100786d3aSWANG Xuerui;
2200786d3aSWANG Xuerui; MEDIUM-LABEL: call_globaladdress:
2300786d3aSWANG Xuerui; MEDIUM:       # %bb.0:
2400786d3aSWANG Xuerui; MEDIUM-NEXT:    addi.d $sp, $sp, -16
2500786d3aSWANG Xuerui; MEDIUM-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
262cf420d5Swanglei; MEDIUM-NEXT:    pcaddu18i $ra, %call36(callee)
272cf420d5Swanglei; MEDIUM-NEXT:    jirl $ra, $ra, 0
2800786d3aSWANG Xuerui; MEDIUM-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
2900786d3aSWANG Xuerui; MEDIUM-NEXT:    addi.d $sp, $sp, 16
3000786d3aSWANG Xuerui; MEDIUM-NEXT:    ret
3100786d3aSWANG Xuerui;
3200786d3aSWANG Xuerui; LARGE-LABEL: call_globaladdress:
3300786d3aSWANG Xuerui; LARGE:       # %bb.0:
3400786d3aSWANG Xuerui; LARGE-NEXT:    addi.d $sp, $sp, -16
3500786d3aSWANG Xuerui; LARGE-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
360e6f64cdShev; LARGE-NEXT:    pcalau12i $a1, %got_pc_hi20(callee)
370e6f64cdShev; LARGE-NEXT:    addi.d $ra, $zero, %got_pc_lo12(callee)
380e6f64cdShev; LARGE-NEXT:    lu32i.d $ra, %got64_pc_lo20(callee)
390e6f64cdShev; LARGE-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(callee)
400e6f64cdShev; LARGE-NEXT:    ldx.d $ra, $ra, $a1
4100786d3aSWANG Xuerui; LARGE-NEXT:    jirl $ra, $ra, 0
4200786d3aSWANG Xuerui; LARGE-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
4300786d3aSWANG Xuerui; LARGE-NEXT:    addi.d $sp, $sp, 16
4400786d3aSWANG Xuerui; LARGE-NEXT:    ret
4500786d3aSWANG Xuerui  %1 = call i32 @callee(i32 %a)
4600786d3aSWANG Xuerui  ret i32 %1
4700786d3aSWANG Xuerui}
4800786d3aSWANG Xuerui
4900786d3aSWANG Xueruidefine void @call_external_sym(ptr %dst) {
5000786d3aSWANG Xuerui; SMALL-LABEL: call_external_sym:
5100786d3aSWANG Xuerui; SMALL:       # %bb.0: # %entry
5200786d3aSWANG Xuerui; SMALL-NEXT:    addi.d $sp, $sp, -16
5300786d3aSWANG Xuerui; SMALL-NEXT:    .cfi_def_cfa_offset 16
5400786d3aSWANG Xuerui; SMALL-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
5500786d3aSWANG Xuerui; SMALL-NEXT:    .cfi_offset 1, -8
5600786d3aSWANG Xuerui; SMALL-NEXT:    ori $a2, $zero, 1000
5700786d3aSWANG Xuerui; SMALL-NEXT:    move $a1, $zero
5800786d3aSWANG Xuerui; SMALL-NEXT:    bl %plt(memset)
5900786d3aSWANG Xuerui; SMALL-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
6000786d3aSWANG Xuerui; SMALL-NEXT:    addi.d $sp, $sp, 16
6100786d3aSWANG Xuerui; SMALL-NEXT:    ret
6200786d3aSWANG Xuerui;
6300786d3aSWANG Xuerui; MEDIUM-LABEL: call_external_sym:
6400786d3aSWANG Xuerui; MEDIUM:       # %bb.0: # %entry
6500786d3aSWANG Xuerui; MEDIUM-NEXT:    addi.d $sp, $sp, -16
6600786d3aSWANG Xuerui; MEDIUM-NEXT:    .cfi_def_cfa_offset 16
6700786d3aSWANG Xuerui; MEDIUM-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
6800786d3aSWANG Xuerui; MEDIUM-NEXT:    .cfi_offset 1, -8
6900786d3aSWANG Xuerui; MEDIUM-NEXT:    ori $a2, $zero, 1000
7000786d3aSWANG Xuerui; MEDIUM-NEXT:    move $a1, $zero
712cf420d5Swanglei; MEDIUM-NEXT:    pcaddu18i $ra, %call36(memset)
722cf420d5Swanglei; MEDIUM-NEXT:    jirl $ra, $ra, 0
7300786d3aSWANG Xuerui; MEDIUM-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
7400786d3aSWANG Xuerui; MEDIUM-NEXT:    addi.d $sp, $sp, 16
7500786d3aSWANG Xuerui; MEDIUM-NEXT:    ret
7600786d3aSWANG Xuerui;
7700786d3aSWANG Xuerui; LARGE-LABEL: call_external_sym:
7800786d3aSWANG Xuerui; LARGE:       # %bb.0: # %entry
7900786d3aSWANG Xuerui; LARGE-NEXT:    addi.d $sp, $sp, -16
8000786d3aSWANG Xuerui; LARGE-NEXT:    .cfi_def_cfa_offset 16
8100786d3aSWANG Xuerui; LARGE-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
8200786d3aSWANG Xuerui; LARGE-NEXT:    .cfi_offset 1, -8
8300786d3aSWANG Xuerui; LARGE-NEXT:    ori $a2, $zero, 1000
8400786d3aSWANG Xuerui; LARGE-NEXT:    move $a1, $zero
85*6377ae46Swanglei; LARGE-NEXT:    pcalau12i $a3, %got_pc_hi20(memset)
86*6377ae46Swanglei; LARGE-NEXT:    addi.d $ra, $zero, %got_pc_lo12(memset)
87*6377ae46Swanglei; LARGE-NEXT:    lu32i.d $ra, %got64_pc_lo20(memset)
88*6377ae46Swanglei; LARGE-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(memset)
89*6377ae46Swanglei; LARGE-NEXT:    ldx.d $ra, $ra, $a3
9000786d3aSWANG Xuerui; LARGE-NEXT:    jirl $ra, $ra, 0
9100786d3aSWANG Xuerui; LARGE-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
9200786d3aSWANG Xuerui; LARGE-NEXT:    addi.d $sp, $sp, 16
9300786d3aSWANG Xuerui; LARGE-NEXT:    ret
9400786d3aSWANG Xueruientry:
9500786d3aSWANG Xuerui  call void @llvm.memset.p0.i64(ptr %dst, i8 0, i64 1000, i1 false)
9600786d3aSWANG Xuerui  ret void
9700786d3aSWANG Xuerui}
9800786d3aSWANG Xuerui
9900786d3aSWANG Xuerui;; Tail call with different codemodel.
10000786d3aSWANG Xueruideclare i32 @callee_tail(i32 %i)
10100786d3aSWANG Xueruidefine i32 @caller_tail(i32 %i) nounwind {
10200786d3aSWANG Xuerui; SMALL-LABEL: caller_tail:
10300786d3aSWANG Xuerui; SMALL:       # %bb.0: # %entry
10400786d3aSWANG Xuerui; SMALL-NEXT:    b %plt(callee_tail)
10500786d3aSWANG Xuerui;
10600786d3aSWANG Xuerui; MEDIUM-LABEL: caller_tail:
10700786d3aSWANG Xuerui; MEDIUM:       # %bb.0: # %entry
108f7a96dc6Shev; MEDIUM-NEXT:    pcaddu18i $t8, %call36(callee_tail)
109f7a96dc6Shev; MEDIUM-NEXT:    jr $t8
11000786d3aSWANG Xuerui;
11100786d3aSWANG Xuerui; LARGE-LABEL: caller_tail:
11200786d3aSWANG Xuerui; LARGE:       # %bb.0: # %entry
1130e6f64cdShev; LARGE-NEXT:    pcalau12i $a1, %got_pc_hi20(callee_tail)
1140e6f64cdShev; LARGE-NEXT:    addi.d $a2, $zero, %got_pc_lo12(callee_tail)
1150e6f64cdShev; LARGE-NEXT:    lu32i.d $a2, %got64_pc_lo20(callee_tail)
1160e6f64cdShev; LARGE-NEXT:    lu52i.d $a2, $a2, %got64_pc_hi12(callee_tail)
1170e6f64cdShev; LARGE-NEXT:    ldx.d $a1, $a2, $a1
1180e6f64cdShev; LARGE-NEXT:    jr $a1
11900786d3aSWANG Xueruientry:
12000786d3aSWANG Xuerui  %r = tail call i32 @callee_tail(i32 %i)
12100786d3aSWANG Xuerui  ret i32 %r
12200786d3aSWANG Xuerui}
123