xref: /llvm-project/llvm/test/CodeGen/LoongArch/inline-asm-constraint-ZC.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA64
4
5define i32 @ZC_offset_neg_32769(ptr %p) nounwind {
6; LA32-LABEL: ZC_offset_neg_32769:
7; LA32:       # %bb.0:
8; LA32-NEXT:    lu12i.w $a1, -9
9; LA32-NEXT:    ori $a1, $a1, 4095
10; LA32-NEXT:    add.w $a0, $a0, $a1
11; LA32-NEXT:    #APP
12; LA32-NEXT:    ll.w $a0, $a0, 0
13; LA32-NEXT:    #NO_APP
14; LA32-NEXT:    ret
15;
16; LA64-LABEL: ZC_offset_neg_32769:
17; LA64:       # %bb.0:
18; LA64-NEXT:    lu12i.w $a1, -9
19; LA64-NEXT:    ori $a1, $a1, 4095
20; LA64-NEXT:    add.d $a0, $a0, $a1
21; LA64-NEXT:    #APP
22; LA64-NEXT:    ll.w $a0, $a0, 0
23; LA64-NEXT:    #NO_APP
24; LA64-NEXT:    ret
25  %1 = getelementptr inbounds i8, ptr %p, i32 -32769
26  %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1)
27  ret i32 %2
28}
29
30define i32 @ZC_offset_neg_32768(ptr %p) nounwind {
31; LA32-LABEL: ZC_offset_neg_32768:
32; LA32:       # %bb.0:
33; LA32-NEXT:    #APP
34; LA32-NEXT:    ll.w $a0, $a0, -32768
35; LA32-NEXT:    #NO_APP
36; LA32-NEXT:    ret
37;
38; LA64-LABEL: ZC_offset_neg_32768:
39; LA64:       # %bb.0:
40; LA64-NEXT:    #APP
41; LA64-NEXT:    ll.w $a0, $a0, -32768
42; LA64-NEXT:    #NO_APP
43; LA64-NEXT:    ret
44  %1 = getelementptr inbounds i8, ptr %p, i32 -32768
45  %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1)
46  ret i32 %2
47}
48
49define i32 @ZC_offset_neg_4(ptr %p) nounwind {
50; LA32-LABEL: ZC_offset_neg_4:
51; LA32:       # %bb.0:
52; LA32-NEXT:    #APP
53; LA32-NEXT:    ll.w $a0, $a0, -4
54; LA32-NEXT:    #NO_APP
55; LA32-NEXT:    ret
56;
57; LA64-LABEL: ZC_offset_neg_4:
58; LA64:       # %bb.0:
59; LA64-NEXT:    #APP
60; LA64-NEXT:    ll.w $a0, $a0, -4
61; LA64-NEXT:    #NO_APP
62; LA64-NEXT:    ret
63  %1 = getelementptr inbounds i8, ptr %p, i32 -4
64  %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1)
65  ret i32 %2
66}
67
68define i32 @ZC_offset_neg_1(ptr %p) nounwind {
69; LA32-LABEL: ZC_offset_neg_1:
70; LA32:       # %bb.0:
71; LA32-NEXT:    addi.w $a0, $a0, -1
72; LA32-NEXT:    #APP
73; LA32-NEXT:    ll.w $a0, $a0, 0
74; LA32-NEXT:    #NO_APP
75; LA32-NEXT:    ret
76;
77; LA64-LABEL: ZC_offset_neg_1:
78; LA64:       # %bb.0:
79; LA64-NEXT:    addi.d $a0, $a0, -1
80; LA64-NEXT:    #APP
81; LA64-NEXT:    ll.w $a0, $a0, 0
82; LA64-NEXT:    #NO_APP
83; LA64-NEXT:    ret
84  %1 = getelementptr inbounds i8, ptr %p, i32 -1
85  %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1)
86  ret i32 %2
87}
88
89define i32 @ZC_offset_0(ptr %p) nounwind {
90; LA32-LABEL: ZC_offset_0:
91; LA32:       # %bb.0:
92; LA32-NEXT:    #APP
93; LA32-NEXT:    ll.w $a0, $a0, 0
94; LA32-NEXT:    #NO_APP
95; LA32-NEXT:    ret
96;
97; LA64-LABEL: ZC_offset_0:
98; LA64:       # %bb.0:
99; LA64-NEXT:    #APP
100; LA64-NEXT:    ll.w $a0, $a0, 0
101; LA64-NEXT:    #NO_APP
102; LA64-NEXT:    ret
103  %1 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %p)
104  ret i32 %1
105}
106
107define i32 @ZC_offset_1(ptr %p) nounwind {
108; LA32-LABEL: ZC_offset_1:
109; LA32:       # %bb.0:
110; LA32-NEXT:    addi.w $a0, $a0, 1
111; LA32-NEXT:    #APP
112; LA32-NEXT:    ll.w $a0, $a0, 0
113; LA32-NEXT:    #NO_APP
114; LA32-NEXT:    ret
115;
116; LA64-LABEL: ZC_offset_1:
117; LA64:       # %bb.0:
118; LA64-NEXT:    addi.d $a0, $a0, 1
119; LA64-NEXT:    #APP
120; LA64-NEXT:    ll.w $a0, $a0, 0
121; LA64-NEXT:    #NO_APP
122; LA64-NEXT:    ret
123  %1 = getelementptr inbounds i8, ptr %p, i32 1
124  %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1)
125  ret i32 %2
126}
127
128define i32 @ZC_offset_32764(ptr %p) nounwind {
129; LA32-LABEL: ZC_offset_32764:
130; LA32:       # %bb.0:
131; LA32-NEXT:    #APP
132; LA32-NEXT:    ll.w $a0, $a0, 32764
133; LA32-NEXT:    #NO_APP
134; LA32-NEXT:    ret
135;
136; LA64-LABEL: ZC_offset_32764:
137; LA64:       # %bb.0:
138; LA64-NEXT:    #APP
139; LA64-NEXT:    ll.w $a0, $a0, 32764
140; LA64-NEXT:    #NO_APP
141; LA64-NEXT:    ret
142  %1 = getelementptr inbounds i8, ptr %p, i32 32764
143  %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1)
144  ret i32 %2
145}
146
147define i32 @ZC_offset_32767(ptr %p) nounwind {
148; LA32-LABEL: ZC_offset_32767:
149; LA32:       # %bb.0:
150; LA32-NEXT:    lu12i.w $a1, 7
151; LA32-NEXT:    ori $a1, $a1, 4095
152; LA32-NEXT:    add.w $a0, $a0, $a1
153; LA32-NEXT:    #APP
154; LA32-NEXT:    ll.w $a0, $a0, 0
155; LA32-NEXT:    #NO_APP
156; LA32-NEXT:    ret
157;
158; LA64-LABEL: ZC_offset_32767:
159; LA64:       # %bb.0:
160; LA64-NEXT:    lu12i.w $a1, 7
161; LA64-NEXT:    ori $a1, $a1, 4095
162; LA64-NEXT:    add.d $a0, $a0, $a1
163; LA64-NEXT:    #APP
164; LA64-NEXT:    ll.w $a0, $a0, 0
165; LA64-NEXT:    #NO_APP
166; LA64-NEXT:    ret
167  %1 = getelementptr inbounds i8, ptr %p, i32 32767
168  %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1)
169  ret i32 %2
170}
171