[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / Hexagon / circ_new.ll
blobcf41f27d388761d2807f3357a5afab6adc74d9e2
1 ; RUN: llc -march=hexagon < %s | FileCheck %s
3 ; CHECK-LABEL: test1
4 ; CHECK: m[[REG1:([0-1])]] = r0
5 ; CHECK: cs[[REG1]] = r1
6 ; CHECK: = memub(r1++#4:circ(m[[REG1]])
7 define zeroext i8 @test1(i32 %mod, i8* %start) local_unnamed_addr #0 {
8 entry:
9   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrub.pci(i8* %start, i32 4, i32 %mod, i8* %start)
10   %1 = extractvalue { i32, i8* } %0, 0
11   %conv = trunc i32 %1 to i8
12   ret i8 %conv
15 declare { i32, i8* } @llvm.hexagon.L2.loadrub.pci(i8*, i32, i32, i8* nocapture) #1
17 ; CHECK-LABEL: test2
18 ; CHECK: m[[REG2:([0-1])]] = r0
19 ; CHECK: cs[[REG2]] = r1
20 ; CHECK: = memb(r1++#4:circ(m[[REG2]])
21 define zeroext i8 @test2(i32 %mod, i8* %start) local_unnamed_addr #0 {
22 entry:
23   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrb.pci(i8* %start, i32 4, i32 %mod, i8* %start)
24   %1 = extractvalue { i32, i8* } %0, 0
25   %conv = trunc i32 %1 to i8
26   ret i8 %conv
29 declare { i32, i8* } @llvm.hexagon.L2.loadrb.pci(i8*, i32, i32, i8* nocapture) #1
31 ; CHECK-LABEL: test3
32 ; CHECK: m[[REG3:([0-1])]] = r0
33 ; CHECK: cs[[REG3]] = r1
34 ; CHECK: = memuh(r1++#4:circ(m[[REG3]])
35 define zeroext i16 @test3(i32 %mod, i8* %start) local_unnamed_addr #0 {
36 entry:
37   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadruh.pci(i8* %start, i32 4, i32 %mod, i8* %start)
38   %1 = extractvalue { i32, i8* } %0, 0
39   %conv = trunc i32 %1 to i16
40   ret i16 %conv
43 declare { i32, i8* } @llvm.hexagon.L2.loadruh.pci(i8*, i32, i32, i8* nocapture) #1
45 ; CHECK-LABEL: test4
46 ; CHECK: m[[REG4:([0-1])]] = r0
47 ; CHECK: cs[[REG4]] = r1
48 ; CHECK: = memh(r1++#4:circ(m[[REG4]])
49 define signext i16 @test4(i32 %mod, i8* %start) local_unnamed_addr #0 {
50 entry:
51   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrh.pci(i8* %start, i32 4, i32 %mod, i8* %start)
52   %1 = extractvalue { i32, i8* } %0, 0
53   %conv = trunc i32 %1 to i16
54   ret i16 %conv
57 declare { i32, i8* } @llvm.hexagon.L2.loadrh.pci(i8*, i32, i32, i8* nocapture) #1
59 ; CHECK-LABEL: test5
60 ; CHECK: m[[REG5:([0-1])]] = r0
61 ; CHECK: cs[[REG5]] = r1
62 ; CHECK: = memw(r1++#4:circ(m[[REG5]])
63 define i32 @test5(i32 %mod, i8* %start) local_unnamed_addr #0 {
64 entry:
65   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadri.pci(i8* %start, i32 4, i32 %mod, i8* %start)
66   %1 = extractvalue { i32, i8* } %0, 0
67   ret i32 %1
70 declare { i32, i8* } @llvm.hexagon.L2.loadri.pci(i8*, i32, i32, i8* nocapture) #1
72 ; CHECK-LABEL: test6
73 ; CHECK: m[[REG6:([0-1])]] = r0
74 ; CHECK: cs[[REG6]] = r1
75 ; CHECK: = memd(r1++#8:circ(m[[REG6]])
76 define i64 @test6(i32 %mod, i8* %start) local_unnamed_addr #0 {
77 entry:
78   %0 = tail call { i64, i8* } @llvm.hexagon.L2.loadrd.pci(i8* %start, i32 8, i32 %mod, i8* %start)
79   %1 = extractvalue { i64, i8* } %0, 0
80   ret i64 %1
83 declare { i64, i8* } @llvm.hexagon.L2.loadrd.pci(i8*, i32, i32, i8* nocapture) #1
85 ; CHECK-LABEL: test7
86 ; CHECK: m[[REG7:([0-1])]] = r0
87 ; CHECK: cs[[REG7]] = r1
88 ; CHECK: = memub(r1++I:circ(m[[REG7]])
89 define zeroext i8 @test7(i32 %mod, i8* %start) local_unnamed_addr #0 {
90 entry:
91   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrub.pcr(i8* %start, i32 %mod, i8* %start)
92   %1 = extractvalue { i32, i8* } %0, 0
93   %conv = trunc i32 %1 to i8
94   ret i8 %conv
97 declare { i32, i8* } @llvm.hexagon.L2.loadrub.pcr(i8*, i32, i8* nocapture) #1
99 ; CHECK-LABEL: test8
100 ; CHECK: m[[REG8:([0-1])]] = r0
101 ; CHECK: cs[[REG8]] = r1
102 ; CHECK: = memb(r1++I:circ(m[[REG8]])
103 define zeroext i8 @test8(i32 %mod, i8* %start) local_unnamed_addr #0 {
104 entry:
105   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrb.pcr(i8* %start, i32 %mod, i8* %start)
106   %1 = extractvalue { i32, i8* } %0, 0
107   %conv = trunc i32 %1 to i8
108   ret i8 %conv
111 declare { i32, i8* } @llvm.hexagon.L2.loadrb.pcr(i8*, i32, i8* nocapture) #1
113 ; CHECK-LABEL: test9
114 ; CHECK: m[[REG9:([0-1])]] = r0
115 ; CHECK: cs[[REG9]] = r1
116 ; CHECK: = memuh(r1++I:circ(m[[REG9]])
117 define zeroext i16 @test9(i32 %mod, i8* %start) local_unnamed_addr #0 {
118 entry:
119   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadruh.pcr(i8* %start, i32 %mod, i8* %start)
120   %1 = extractvalue { i32, i8* } %0, 0
121   %conv = trunc i32 %1 to i16
122   ret i16 %conv
125 declare { i32, i8* } @llvm.hexagon.L2.loadruh.pcr(i8*, i32, i8* nocapture) #1
127 ; CHECK-LABEL: test10
128 ; CHECK: m[[REG10:([0-1])]] = r0
129 ; CHECK: cs[[REG10]] = r1
130 ; CHECK: = memh(r1++I:circ(m[[REG10]])
131 define signext i16 @test10(i32 %mod, i8* %start) local_unnamed_addr #0 {
132 entry:
133   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrh.pcr(i8* %start, i32 %mod, i8* %start)
134   %1 = extractvalue { i32, i8* } %0, 0
135   %conv = trunc i32 %1 to i16
136   ret i16 %conv
139 declare { i32, i8* } @llvm.hexagon.L2.loadrh.pcr(i8*, i32, i8* nocapture) #1
141 ; CHECK-LABEL: test11
142 ; CHECK: m[[REG11:([0-1])]] = r0
143 ; CHECK: cs[[REG11]] = r1
144 ; CHECK: = memw(r1++I:circ(m[[REG11]])
145 define i32 @test11(i32 %mod, i8* %start) local_unnamed_addr #0 {
146 entry:
147   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadri.pcr(i8* %start, i32 %mod, i8* %start)
148   %1 = extractvalue { i32, i8* } %0, 0
149   ret i32 %1
152 declare { i32, i8* } @llvm.hexagon.L2.loadri.pcr(i8*, i32, i8* nocapture) #1
154 ; CHECK-LABEL: test12
155 ; CHECK: m[[REG12:([0-1])]] = r0
156 ; CHECK: cs[[REG12]] = r1
157 ; CHECK: = memd(r1++I:circ(m[[REG12]])
158 define i64 @test12(i32 %mod, i8* %start) local_unnamed_addr #0 {
159 entry:
160   %0 = tail call { i64, i8* } @llvm.hexagon.L2.loadrd.pcr(i8* %start, i32 %mod, i8* %start)
161   %1 = extractvalue { i64, i8* } %0, 0
162   ret i64 %1
165 declare { i64, i8* } @llvm.hexagon.L2.loadrd.pcr(i8*, i32, i8* nocapture) #1
167 ; CHECK-LABEL: test13
168 ; CHECK: m[[REG13:([0-1])]] = r0
169 ; CHECK: cs[[REG13]] = r1
170 ; CHECK: memb(r1++#4:circ(m[[REG13]])) =
171 define void @test13(i32 %mod, i8* %start, i8 zeroext %v) local_unnamed_addr #0 {
172 entry:
173   %conv = zext i8 %v to i32
174   %0 = tail call i8* @llvm.hexagon.S2.storerb.pci(i8* %start, i32 4, i32 %mod, i32 %conv, i8* %start)
175   ret void
178 declare i8* @llvm.hexagon.S2.storerb.pci(i8*, i32, i32, i32, i8* nocapture) #1
180 ; CHECK-LABEL: test14
181 ; CHECK: m[[REG14:([0-1])]] = r0
182 ; CHECK: cs[[REG14]] = r1
183 ; CHECK: memh(r1++#4:circ(m[[REG14]])) =
184 define void @test14(i32 %mod, i8* %start, i16 signext %v) local_unnamed_addr #0 {
185 entry:
186   %conv = sext i16 %v to i32
187   %0 = tail call i8* @llvm.hexagon.S2.storerh.pci(i8* %start, i32 4, i32 %mod, i32 %conv, i8* %start)
188   ret void
191 declare i8* @llvm.hexagon.S2.storerh.pci(i8*, i32, i32, i32, i8* nocapture) #1
193 ; CHECK-LABEL: test15
194 ; CHECK: m[[REG15:([0-1])]] = r0
195 ; CHECK: cs[[REG15]] = r1
196 ; CHECK: memh(r1++#4:circ(m[[REG15]])) = r{{[0-9]+}}.h
197 define void @test15(i32 %mod, i8* %start, i16 signext %v) local_unnamed_addr #0 {
198 entry:
199   %conv = sext i16 %v to i32
200   %0 = tail call i8* @llvm.hexagon.S2.storerf.pci(i8* %start, i32 4, i32 %mod, i32 %conv, i8* %start)
201   ret void
204 declare i8* @llvm.hexagon.S2.storerf.pci(i8*, i32, i32, i32, i8* nocapture) #1
206 ; CHECK-LABEL: test16
207 ; CHECK: m[[REG16:([0-1])]] = r0
208 ; CHECK: cs[[REG16]] = r1
209 ; CHECK: memw(r1++#4:circ(m[[REG16]])) =
210 define void @test16(i32 %mod, i8* %start, i32 %v) local_unnamed_addr #0 {
211 entry:
212   %0 = tail call i8* @llvm.hexagon.S2.storeri.pci(i8* %start, i32 4, i32 %mod, i32 %v, i8* %start)
213   ret void
216 declare i8* @llvm.hexagon.S2.storeri.pci(i8*, i32, i32, i32, i8* nocapture) #1
218 ; CHECK-LABEL: test17
219 ; CHECK: m[[REG17:([0-1])]] = r0
220 ; CHECK: cs[[REG17]] = r1
221 ; CHECK: memd(r1++#8:circ(m[[REG17]])) =
222 define void @test17(i32 %mod, i8* %start, i64 %v) local_unnamed_addr #0 {
223 entry:
224   %0 = tail call i8* @llvm.hexagon.S2.storerd.pci(i8* %start, i32 8, i32 %mod, i64 %v, i8* %start)
225   ret void
228 declare i8* @llvm.hexagon.S2.storerd.pci(i8*, i32, i32, i64, i8* nocapture) #1
230 ; CHECK-LABEL: test18
231 ; CHECK: m[[REG18:([0-1])]] = r0
232 ; CHECK: cs[[REG18]] = r1
233 ; CHECK: memb(r1++I:circ(m[[REG18]])) =
234 define void @test18(i32 %mod, i8* %start, i8 zeroext %v) local_unnamed_addr #0 {
235 entry:
236   %conv = zext i8 %v to i32
237   %0 = tail call i8* @llvm.hexagon.S2.storerb.pcr(i8* %start, i32 %mod, i32 %conv, i8* %start)
238   ret void
241 declare i8* @llvm.hexagon.S2.storerb.pcr(i8*, i32, i32, i8* nocapture) #1
243 ; CHECK-LABEL: test19
244 ; CHECK: m[[REG19:([0-1])]] = r0
245 ; CHECK: cs[[REG19]] = r1
246 ; CHECK: memh(r1++I:circ(m[[REG19]])) =
247 define void @test19(i32 %mod, i8* %start, i16 signext %v) local_unnamed_addr #0 {
248 entry:
249   %conv = sext i16 %v to i32
250   %0 = tail call i8* @llvm.hexagon.S2.storerh.pcr(i8* %start, i32 %mod, i32 %conv, i8* %start)
251   ret void
254 declare i8* @llvm.hexagon.S2.storerh.pcr(i8*, i32, i32, i8* nocapture) #1
256 ; CHECK-LABEL: test20
257 ; CHECK: m[[REG20:([0-1])]] = r0
258 ; CHECK: cs[[REG20]] = r1
259 ; CHECK: memh(r1++I:circ(m[[REG20]])) = r{{[0-9]+}}.h
260 define void @test20(i32 %mod, i8* %start, i16 signext %v) local_unnamed_addr #0 {
261 entry:
262   %conv = sext i16 %v to i32
263   %0 = tail call i8* @llvm.hexagon.S2.storerf.pcr(i8* %start, i32 %mod, i32 %conv, i8* %start)
264   ret void
267 declare i8* @llvm.hexagon.S2.storerf.pcr(i8*, i32, i32, i8* nocapture) #1
269 ; CHECK-LABEL: test21
270 ; CHECK: m[[REG21:([0-1])]] = r0
271 ; CHECK: cs[[REG21]] = r1
272 ; CHECK: memw(r1++I:circ(m[[REG21]])) =
273 define void @test21(i32 %mod, i8* %start, i32 %v) local_unnamed_addr #0 {
274 entry:
275   %0 = tail call i8* @llvm.hexagon.S2.storeri.pcr(i8* %start, i32 %mod, i32 %v, i8* %start)
276   ret void
279 declare i8* @llvm.hexagon.S2.storeri.pcr(i8*, i32, i32, i8* nocapture) #1
281 ; CHECK-LABEL: test22
282 ; CHECK: m[[REG22:([0-1])]] = r0
283 ; CHECK: cs[[REG22]] = r1
284 ; CHECK: memd(r1++I:circ(m[[REG1]])) =
285 define void @test22(i32 %mod, i8* %start, i64 %v) local_unnamed_addr #0 {
286 entry:
287   %0 = tail call i8* @llvm.hexagon.S2.storerd.pcr(i8* %start, i32 %mod, i64 %v, i8* %start)
288   ret void
291 declare i8* @llvm.hexagon.S2.storerd.pcr(i8*, i32, i64, i8* nocapture) #1
293 attributes #0 = { nounwind "target-cpu"="hexagonv60" }
294 attributes #1 = { argmemonly nounwind }