[AMDGPU] Mark AGPR tuple implicit in the first instr of AGPR spills. (#115285)
[llvm-project.git] / llvm / test / CodeGen / LoongArch / intrinsic-la64.ll
blobd94da34e14c4c8a797b4147ef8e7d6ac5451fb59
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s
4 declare void @llvm.loongarch.cacop.d(i64, i64, i64)
5 declare i32 @llvm.loongarch.crc.w.b.w(i32, i32)
6 declare i32 @llvm.loongarch.crc.w.h.w(i32, i32)
7 declare i32 @llvm.loongarch.crc.w.w.w(i32, i32)
8 declare i32 @llvm.loongarch.crc.w.d.w(i64, i32)
9 declare i32 @llvm.loongarch.crcc.w.b.w(i32, i32)
10 declare i32 @llvm.loongarch.crcc.w.h.w(i32, i32)
11 declare i32 @llvm.loongarch.crcc.w.w.w(i32, i32)
12 declare i32 @llvm.loongarch.crcc.w.d.w(i64, i32)
13 declare i64 @llvm.loongarch.csrrd.d(i32 immarg)
14 declare i64 @llvm.loongarch.csrwr.d(i64, i32 immarg)
15 declare i64 @llvm.loongarch.csrxchg.d(i64, i64, i32 immarg)
16 declare i64 @llvm.loongarch.iocsrrd.d(i32)
17 declare void @llvm.loongarch.iocsrwr.d(i64, i32)
18 declare void @llvm.loongarch.asrtle.d(i64, i64)
19 declare void @llvm.loongarch.asrtgt.d(i64, i64)
20 declare i64 @llvm.loongarch.lddir.d(i64, i64)
21 declare void @llvm.loongarch.ldpte.d(i64, i64)
23 define i32 @crc_w_b_w(i32 %a, i32 %b) nounwind {
24 ; CHECK-LABEL: crc_w_b_w:
25 ; CHECK:       # %bb.0:
26 ; CHECK-NEXT:    crc.w.b.w $a0, $a0, $a1
27 ; CHECK-NEXT:    ret
28   %res = call i32 @llvm.loongarch.crc.w.b.w(i32 %a, i32 %b)
29   ret i32 %res
32 define void @crc_w_b_w_noret(i32 %a, i32 %b) nounwind {
33 ; CHECK-LABEL: crc_w_b_w_noret:
34 ; CHECK:       # %bb.0:
35 ; CHECK-NEXT:    ret
36   %res = call i32 @llvm.loongarch.crc.w.b.w(i32 %a, i32 %b)
37   ret void
40 define i32 @crc_w_h_w(i32 %a, i32 %b) nounwind {
41 ; CHECK-LABEL: crc_w_h_w:
42 ; CHECK:       # %bb.0:
43 ; CHECK-NEXT:    crc.w.h.w $a0, $a0, $a1
44 ; CHECK-NEXT:    ret
45   %res = call i32 @llvm.loongarch.crc.w.h.w(i32 %a, i32 %b)
46   ret i32 %res
49 define void @crc_w_h_w_noret(i32 %a, i32 %b) nounwind {
50 ; CHECK-LABEL: crc_w_h_w_noret:
51 ; CHECK:       # %bb.0:
52 ; CHECK-NEXT:    ret
53   %res = call i32 @llvm.loongarch.crc.w.h.w(i32 %a, i32 %b)
54   ret void
57 define i32 @crc_w_w_w(i32 %a, i32 %b) nounwind {
58 ; CHECK-LABEL: crc_w_w_w:
59 ; CHECK:       # %bb.0:
60 ; CHECK-NEXT:    crc.w.w.w $a0, $a0, $a1
61 ; CHECK-NEXT:    ret
62   %res = call i32 @llvm.loongarch.crc.w.w.w(i32 %a, i32 %b)
63   ret i32 %res
66 define void @crc_w_w_w_noret(i32 %a, i32 %b) nounwind {
67 ; CHECK-LABEL: crc_w_w_w_noret:
68 ; CHECK:       # %bb.0:
69 ; CHECK-NEXT:    ret
70   %res = call i32 @llvm.loongarch.crc.w.w.w(i32 %a, i32 %b)
71   ret void
74 define void @cacop_d(i64 %a) nounwind {
75 ; CHECK-LABEL: cacop_d:
76 ; CHECK:       # %bb.0:
77 ; CHECK-NEXT:    cacop 1, $a0, 4
78 ; CHECK-NEXT:    ret
79   call void @llvm.loongarch.cacop.d(i64 1, i64 %a, i64 4)
80   ret void
83 define i32 @crc_w_d_w(i64 %a, i32 %b) nounwind {
84 ; CHECK-LABEL: crc_w_d_w:
85 ; CHECK:       # %bb.0:
86 ; CHECK-NEXT:    crc.w.d.w $a0, $a0, $a1
87 ; CHECK-NEXT:    ret
88   %res = call i32 @llvm.loongarch.crc.w.d.w(i64 %a, i32 %b)
89   ret i32 %res
92 define void @crc_w_d_w_noret(i64 %a, i32 %b) nounwind {
93 ; CHECK-LABEL: crc_w_d_w_noret:
94 ; CHECK:       # %bb.0:
95 ; CHECK-NEXT:    ret
96   %res = call i32 @llvm.loongarch.crc.w.d.w(i64 %a, i32 %b)
97   ret void
100 define i32 @crcc_w_b_w(i32 %a, i32 %b) nounwind {
101 ; CHECK-LABEL: crcc_w_b_w:
102 ; CHECK:       # %bb.0:
103 ; CHECK-NEXT:    crcc.w.b.w $a0, $a0, $a1
104 ; CHECK-NEXT:    ret
105   %res = call i32 @llvm.loongarch.crcc.w.b.w(i32 %a, i32 %b)
106   ret i32 %res
109 define void @crcc_w_b_w_noret(i32 %a, i32 %b) nounwind {
110 ; CHECK-LABEL: crcc_w_b_w_noret:
111 ; CHECK:       # %bb.0:
112 ; CHECK-NEXT:    ret
113   %res = call i32 @llvm.loongarch.crcc.w.b.w(i32 %a, i32 %b)
114   ret void
117 define i32 @crcc_w_h_w(i32 %a, i32 %b) nounwind {
118 ; CHECK-LABEL: crcc_w_h_w:
119 ; CHECK:       # %bb.0:
120 ; CHECK-NEXT:    crcc.w.h.w $a0, $a0, $a1
121 ; CHECK-NEXT:    ret
122   %res = call i32 @llvm.loongarch.crcc.w.h.w(i32 %a, i32 %b)
123   ret i32 %res
126 define void @crcc_w_h_w_noret(i32 %a, i32 %b) nounwind {
127 ; CHECK-LABEL: crcc_w_h_w_noret:
128 ; CHECK:       # %bb.0:
129 ; CHECK-NEXT:    ret
130   %res = call i32 @llvm.loongarch.crcc.w.h.w(i32 %a, i32 %b)
131   ret void
134 define i32 @crcc_w_w_w(i32 %a, i32 %b) nounwind {
135 ; CHECK-LABEL: crcc_w_w_w:
136 ; CHECK:       # %bb.0:
137 ; CHECK-NEXT:    crcc.w.w.w $a0, $a0, $a1
138 ; CHECK-NEXT:    ret
139   %res = call i32 @llvm.loongarch.crcc.w.w.w(i32 %a, i32 %b)
140   ret i32 %res
143 define void @crcc_w_w_w_noret(i32 %a, i32 %b) nounwind {
144 ; CHECK-LABEL: crcc_w_w_w_noret:
145 ; CHECK:       # %bb.0:
146 ; CHECK-NEXT:    ret
147   %res = call i32 @llvm.loongarch.crcc.w.w.w(i32 %a, i32 %b)
148   ret void
151 define i32 @crcc_w_d_w(i64 %a, i32 %b) nounwind {
152 ; CHECK-LABEL: crcc_w_d_w:
153 ; CHECK:       # %bb.0:
154 ; CHECK-NEXT:    crcc.w.d.w $a0, $a0, $a1
155 ; CHECK-NEXT:    ret
156   %res = call i32 @llvm.loongarch.crcc.w.d.w(i64 %a, i32 %b)
157   ret i32 %res
160 define void @crcc_w_d_w_noret(i64 %a, i32 %b) nounwind {
161 ; CHECK-LABEL: crcc_w_d_w_noret:
162 ; CHECK:       # %bb.0:
163 ; CHECK-NEXT:    ret
164   %res = call i32 @llvm.loongarch.crcc.w.d.w(i64 %a, i32 %b)
165   ret void
168 define i64 @csrrd_d() {
169 ; CHECK-LABEL: csrrd_d:
170 ; CHECK:       # %bb.0: # %entry
171 ; CHECK-NEXT:    csrrd $a0, 1
172 ; CHECK-NEXT:    ret
173 entry:
174   %0 = tail call i64 @llvm.loongarch.csrrd.d(i32 1)
175   ret i64 %0
178 define void @csrrd_d_noret() {
179 ; CHECK-LABEL: csrrd_d_noret:
180 ; CHECK:       # %bb.0: # %entry
181 ; CHECK-NEXT:    csrrd $zero, 1
182 ; CHECK-NEXT:    ret
183 entry:
184   %0 = tail call i64 @llvm.loongarch.csrrd.d(i32 1)
185   ret void
188 define i64 @csrwr_d(i64 %a) {
189 ; CHECK-LABEL: csrwr_d:
190 ; CHECK:       # %bb.0: # %entry
191 ; CHECK-NEXT:    csrwr $a0, 1
192 ; CHECK-NEXT:    ret
193 entry:
194   %0 = tail call i64 @llvm.loongarch.csrwr.d(i64 %a, i32 1)
195   ret i64 %0
198 ;; Check that csrwr is emitted even if the return value of the intrinsic is not used.
199 define void @csrwr_d_noret(i64 %a) {
200 ; CHECK-LABEL: csrwr_d_noret:
201 ; CHECK:       # %bb.0: # %entry
202 ; CHECK-NEXT:    csrwr $a0, 1
203 ; CHECK-NEXT:    ret
204 entry:
205   %0 = tail call i64 @llvm.loongarch.csrwr.d(i64 %a, i32 1)
206   ret void
209 define i64 @csrxchg_d(i64 %a, i64 %b) {
210 ; CHECK-LABEL: csrxchg_d:
211 ; CHECK:       # %bb.0: # %entry
212 ; CHECK-NEXT:    csrxchg $a0, $a1, 1
213 ; CHECK-NEXT:    ret
214 entry:
215   %0 = tail call i64 @llvm.loongarch.csrxchg.d(i64 %a, i64 %b, i32 1)
216   ret i64 %0
219 ;; Check that csrxchg is emitted even if the return value of the intrinsic is not used.
220 define void @csrxchg_d_noret(i64 %a, i64 %b) {
221 ; CHECK-LABEL: csrxchg_d_noret:
222 ; CHECK:       # %bb.0: # %entry
223 ; CHECK-NEXT:    csrxchg $a0, $a1, 1
224 ; CHECK-NEXT:    ret
225 entry:
226   %0 = tail call i64 @llvm.loongarch.csrxchg.d(i64 %a, i64 %b, i32 1)
227   ret void
230 define i64 @iocsrrd_d(i32 %a) {
231 ; CHECK-LABEL: iocsrrd_d:
232 ; CHECK:       # %bb.0: # %entry
233 ; CHECK-NEXT:    iocsrrd.d $a0, $a0
234 ; CHECK-NEXT:    ret
235 entry:
236   %0 = tail call i64 @llvm.loongarch.iocsrrd.d(i32 %a)
237   ret i64 %0
240 define void @iocsrrd_d_noret(i32 %a) {
241 ; CHECK-LABEL: iocsrrd_d_noret:
242 ; CHECK:       # %bb.0: # %entry
243 ; CHECK-NEXT:    iocsrrd.d $zero, $a0
244 ; CHECK-NEXT:    ret
245 entry:
246   %0 = tail call i64 @llvm.loongarch.iocsrrd.d(i32 %a)
247   ret void
250 define void @iocsrwr_d(i64 %a, i32 signext %b) {
251 ; CHECK-LABEL: iocsrwr_d:
252 ; CHECK:       # %bb.0: # %entry
253 ; CHECK-NEXT:    iocsrwr.d $a0, $a1
254 ; CHECK-NEXT:    ret
255 entry:
256   tail call void @llvm.loongarch.iocsrwr.d(i64 %a, i32 %b)
257   ret void
260 define void @asrtle_d(i64 %a, i64 %b) {
261 ; CHECK-LABEL: asrtle_d:
262 ; CHECK:       # %bb.0: # %entry
263 ; CHECK-NEXT:    asrtle.d $a0, $a1
264 ; CHECK-NEXT:    ret
265 entry:
266   tail call void @llvm.loongarch.asrtle.d(i64 %a, i64 %b)
267   ret void
270 define void @asrtgt_d(i64 %a, i64 %b) {
271 ; CHECK-LABEL: asrtgt_d:
272 ; CHECK:       # %bb.0: # %entry
273 ; CHECK-NEXT:    asrtgt.d $a0, $a1
274 ; CHECK-NEXT:    ret
275 entry:
276   tail call void @llvm.loongarch.asrtgt.d(i64 %a, i64 %b)
277   ret void
280 define i64 @lddir_d(i64 %a) {
281 ; CHECK-LABEL: lddir_d:
282 ; CHECK:       # %bb.0: # %entry
283 ; CHECK-NEXT:    lddir $a0, $a0, 1
284 ; CHECK-NEXT:    ret
285 entry:
286   %0 = tail call i64 @llvm.loongarch.lddir.d(i64 %a, i64 1)
287   ret i64 %0
290 define void @lddir_d_noret(i64 %a) {
291 ; CHECK-LABEL: lddir_d_noret:
292 ; CHECK:       # %bb.0: # %entry
293 ; CHECK-NEXT:    lddir $zero, $a0, 1
294 ; CHECK-NEXT:    ret
295 entry:
296   %0 = tail call i64 @llvm.loongarch.lddir.d(i64 %a, i64 1)
297   ret void
300 define void @ldpte_d(i64 %a) {
301 ; CHECK-LABEL: ldpte_d:
302 ; CHECK:       # %bb.0: # %entry
303 ; CHECK-NEXT:    ldpte $a0, 1
304 ; CHECK-NEXT:    ret
305 entry:
306   tail call void @llvm.loongarch.ldpte.d(i64 %a, i64 1)
307   ret void