xref: /llvm-project/llvm/test/CodeGen/LoongArch/stptr.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4
5;; Check that stptr.w is not emitted for small offsets.
6define void @stptr_w_too_small_offset(ptr %p, i32 signext %val) nounwind {
7; LA32-LABEL: stptr_w_too_small_offset:
8; LA32:       # %bb.0:
9; LA32-NEXT:    st.w $a1, $a0, 2044
10; LA32-NEXT:    ret
11;
12; LA64-LABEL: stptr_w_too_small_offset:
13; LA64:       # %bb.0:
14; LA64-NEXT:    st.w $a1, $a0, 2044
15; LA64-NEXT:    ret
16  %addr = getelementptr inbounds i32, ptr %p, i64 511
17  store i32 %val, ptr %addr, align 4
18  ret void
19}
20
21;; Check that stptr.w is emitted for applicable offsets.
22define void @stptr_w(ptr %p, i32 signext %val) nounwind {
23; LA32-LABEL: stptr_w:
24; LA32:       # %bb.0:
25; LA32-NEXT:    addi.w $a0, $a0, 2047
26; LA32-NEXT:    addi.w $a0, $a0, 1
27; LA32-NEXT:    st.w $a1, $a0, 0
28; LA32-NEXT:    ret
29;
30; LA64-LABEL: stptr_w:
31; LA64:       # %bb.0:
32; LA64-NEXT:    stptr.w $a1, $a0, 2048
33; LA64-NEXT:    ret
34  %addr = getelementptr inbounds i32, ptr %p, i64 512
35  store i32 %val, ptr %addr, align 4
36  ret void
37}
38
39;; Check that stptr.w is not emitted for out-of-range offsets.
40define void @stptr_w_too_big_offset(ptr %p, i32 signext %val) nounwind {
41; LA32-LABEL: stptr_w_too_big_offset:
42; LA32:       # %bb.0:
43; LA32-NEXT:    lu12i.w $a2, 8
44; LA32-NEXT:    add.w $a0, $a0, $a2
45; LA32-NEXT:    st.w $a1, $a0, 0
46; LA32-NEXT:    ret
47;
48; LA64-LABEL: stptr_w_too_big_offset:
49; LA64:       # %bb.0:
50; LA64-NEXT:    lu12i.w $a2, 8
51; LA64-NEXT:    stx.w $a1, $a0, $a2
52; LA64-NEXT:    ret
53  %addr = getelementptr inbounds i32, ptr %p, i64 8192
54  store i32 %val, ptr %addr, align 4
55  ret void
56}
57
58;; Check that stptr.d is not emitted for small offsets.
59define void @stptr_d_too_small_offset(ptr %p, i64 %val) nounwind {
60; LA32-LABEL: stptr_d_too_small_offset:
61; LA32:       # %bb.0:
62; LA32-NEXT:    st.w $a2, $a0, 2044
63; LA32-NEXT:    st.w $a1, $a0, 2040
64; LA32-NEXT:    ret
65;
66; LA64-LABEL: stptr_d_too_small_offset:
67; LA64:       # %bb.0:
68; LA64-NEXT:    st.d $a1, $a0, 2040
69; LA64-NEXT:    ret
70  %addr = getelementptr inbounds i64, ptr %p, i64 255
71  store i64 %val, ptr %addr, align 8
72  ret void
73}
74
75;; Check that stptr.d is emitted for applicable offsets.
76define void @stptr_d(ptr %p, i64 %val) nounwind {
77; LA32-LABEL: stptr_d:
78; LA32:       # %bb.0:
79; LA32-NEXT:    addi.w $a0, $a0, 2047
80; LA32-NEXT:    addi.w $a0, $a0, 1
81; LA32-NEXT:    st.w $a2, $a0, 4
82; LA32-NEXT:    st.w $a1, $a0, 0
83; LA32-NEXT:    ret
84;
85; LA64-LABEL: stptr_d:
86; LA64:       # %bb.0:
87; LA64-NEXT:    stptr.d $a1, $a0, 2048
88; LA64-NEXT:    ret
89  %addr = getelementptr inbounds i64, ptr %p, i64 256
90  store i64 %val, ptr %addr, align 8
91  ret void
92}
93
94;; Check that stptr.d is not emitted for out-of-range offsets.
95define void @stptr_d_too_big_offset(ptr %p, i64 %val) nounwind {
96; LA32-LABEL: stptr_d_too_big_offset:
97; LA32:       # %bb.0:
98; LA32-NEXT:    lu12i.w $a3, 8
99; LA32-NEXT:    add.w $a0, $a0, $a3
100; LA32-NEXT:    st.w $a2, $a0, 4
101; LA32-NEXT:    st.w $a1, $a0, 0
102; LA32-NEXT:    ret
103;
104; LA64-LABEL: stptr_d_too_big_offset:
105; LA64:       # %bb.0:
106; LA64-NEXT:    lu12i.w $a2, 8
107; LA64-NEXT:    stx.d $a1, $a0, $a2
108; LA64-NEXT:    ret
109  %addr = getelementptr inbounds i64, ptr %p, i64 4096
110  store i64 %val, ptr %addr, align 8
111  ret void
112}
113