xref: /llvm-project/llvm/test/CodeGen/AVR/cmp.ll (revision 9ef1d37ffb5f56a9b949a6307bbb16c2ea0130e3)
1; RUN: llc < %s -mtriple=avr | FileCheck %s
2; RUN: llc < %s -mtriple=avr -mcpu=attiny10 | FileCheck --check-prefix=TINY %s
3
4declare void @f1(i8)
5declare void @f2(i8)
6define void @cmp8(i8 %a, i8 %b) {
7; CHECK-LABEL: cmp8:
8; CHECK: cp
9; CHECK-NOT: cpc
10  %cmp = icmp eq i8 %a, %b
11  br i1 %cmp, label %if.then, label %if.else
12if.then:
13  tail call void @f1(i8 %a)
14  br label %if.end
15if.else:
16  tail call void @f2(i8 %b)
17  br label %if.end
18if.end:
19  ret void
20}
21
22declare void @f3(i16)
23declare void @f4(i16)
24define void @cmp16(i16 %a, i16 %b) {
25; CHECK-LABEL: cmp16:
26; CHECK: cp
27; CHECK-NEXT: cpc
28  %cmp = icmp eq i16 %a, %b
29  br i1 %cmp, label %if.then, label %if.else
30if.then:
31  tail call void @f3(i16 %a)
32  br label %if.end
33if.else:
34  tail call void @f4(i16 %b)
35  br label %if.end
36if.end:
37  ret void
38}
39
40define void @cmpimm16(i16 %a) {
41; CHECK-LABEL: cmpimm16:
42; CHECK: cpi
43; CHECK-NEXT: cpc
44  %cmp = icmp eq i16 %a, 4567
45  br i1 %cmp, label %if.then, label %if.else
46if.then:
47  tail call void @f3(i16 %a)
48  br label %if.end
49if.else:
50  tail call void @f4(i16 %a)
51  br label %if.end
52if.end:
53  ret void
54}
55
56declare void @f5(i32)
57declare void @f6(i32)
58define void @cmp32(i32 %a, i32 %b) {
59; CHECK-LABEL: cmp32:
60; CHECK: cp
61; CHECK-NEXT: cpc
62; CHECK-NEXT: cpc
63; CHECK-NEXT: cpc
64  %cmp = icmp eq i32 %a, %b
65  br i1 %cmp, label %if.then, label %if.else
66if.then:
67  tail call void @f5(i32 %a)
68  br label %if.end
69if.else:
70  tail call void @f6(i32 %b)
71  br label %if.end
72if.end:
73  ret void
74}
75
76define void @cmpimm32(i32 %a) {
77; CHECK-LABEL: cmpimm32:
78; CHECK: cpi
79; CHECK-NEXT: cpc
80; CHECK-NEXT: cpc
81; CHECK-NEXT: cpc
82  %cmp = icmp eq i32 %a, 6789343
83  br i1 %cmp, label %if.then, label %if.else
84if.then:
85  tail call void @f5(i32 %a)
86  br label %if.end
87if.else:
88  tail call void @f6(i32 %a)
89  br label %if.end
90if.end:
91  ret void
92}
93
94declare void @f7(i64)
95declare void @f8(i64)
96define void @cmp64(i64 %a, i64 %b) {
97; CHECK-LABEL: cmp64:
98; CHECK: cp
99; CHECK-NEXT: cpc
100; CHECK-NEXT: cpc
101; CHECK-NEXT: cpc
102; CHECK-NEXT: cpc
103; CHECK-NEXT: cpc
104; CHECK-NEXT: cpc
105; CHECK-NEXT: cpc
106  %cmp = icmp eq i64 %a, %b
107  br i1 %cmp, label %if.then, label %if.else
108if.then:
109  tail call void @f7(i64 %a)
110  br label %if.end
111if.else:
112  tail call void @f8(i64 %b)
113  br label %if.end
114if.end:
115  ret void
116}
117
118define void @cmpimm64(i64 %a) {
119; CHECK-LABEL: cmpimm64:
120; CHECK: cpi
121; CHECK-NEXT: cpc
122; CHECK-NEXT: cpc
123; CHECK-NEXT: cpc
124; CHECK-NEXT: cpc
125; CHECK-NEXT: cpc
126; CHECK-NEXT: cpc
127; CHECK-NEXT: cpc
128  %cmp = icmp eq i64 %a, 234566452
129  br i1 %cmp, label %if.then, label %if.else
130if.then:
131  tail call void @f7(i64 %a)
132  br label %if.end
133if.else:
134  tail call void @f8(i64 %a)
135  br label %if.end
136if.end:
137  ret void
138}
139
140declare void @f9()
141declare void @f10()
142
143define void @tst8(i8 %a) {
144; CHECK-LABEL: tst8:
145; CHECK: tst r24
146; CHECK-NEXT: brmi
147  %cmp = icmp sgt i8 %a, -1
148  br i1 %cmp, label %if.then, label %if.else
149if.then:
150  tail call void @f9()
151  br label %if.end
152if.else:
153  tail call void @f10()
154  br label %if.end
155if.end:
156  ret void
157}
158
159define void @tst16(i16 %a) {
160; CHECK-LABEL: tst16:
161; CHECK: tst r25
162; CHECK-NEXT: brmi
163  %cmp = icmp sgt i16 %a, -1
164  br i1 %cmp, label %if.then, label %if.else
165if.then:
166  tail call void @f9()
167  br label %if.end
168if.else:
169  tail call void @f10()
170  br label %if.end
171if.end:
172  ret void
173}
174
175define void @tst32(i32 %a) {
176; CHECK-LABEL: tst32:
177; CHECK: tst r25
178; CHECK-NEXT: brmi
179  %cmp = icmp sgt i32 %a, -1
180  br i1 %cmp, label %if.then, label %if.else
181if.then:
182  tail call void @f9()
183  br label %if.end
184if.else:
185  tail call void @f10()
186  br label %if.end
187if.end:
188  ret void
189}
190
191define void @tst64(i64 %a) {
192; CHECK-LABEL: tst64:
193; CHECK: tst r25
194; CHECK-NEXT: brmi
195  %cmp = icmp sgt i64 %a, -1
196  br i1 %cmp, label %if.then, label %if.else
197if.then:
198  tail call void @f9()
199  br label %if.end
200if.else:
201  tail call void @f10()
202  br label %if.end
203if.end:
204  ret void
205}
206
207define i16 @cmp_i16_gt_0(i16 %0) {
208; CHECK-LABEL: cmp_i16_gt_0:
209; CHECK:       ; %bb.0:
210; CHECK-NEXT:    ldi r18, 1
211; CHECK-NEXT:    cp r1, r24
212; CHECK-NEXT:    cpc r1, r25
213; CHECK-NEXT:    brlt .LBB11_2
214; CHECK-NEXT:  ; %bb.1:
215; CHECK-NEXT:    mov r18, r1
216; CHECK-NEXT:  .LBB11_2:
217; CHECK-NEXT:    mov r24, r18
218; CHECK-NEXT:    clr r25
219; CHECK-NEXT:    ret
220;
221; TINY-LABEL: cmp_i16_gt_0:
222; TINY:       ; %bb.0:
223; TINY-NEXT:    ldi r20, 1
224; TINY-NEXT:    cp r17, r24
225; TINY-NEXT:    cpc r17, r25
226; TINY-NEXT:    brlt .LBB11_2
227; TINY-NEXT:  ; %bb.1:
228; TINY-NEXT:    mov r20, r17
229; TINY-NEXT:  .LBB11_2:
230; TINY-NEXT:    mov r24, r20
231; TINY-NEXT:    clr r25
232; TINY-NEXT:    ret
233  %2 = icmp sgt i16 %0, 0
234  %3 = zext i1 %2 to i16
235  ret i16 %3
236}
237
238define i16 @cmp_i16_gt_126(i16 %0) {
239; CHECK-LABEL: cmp_i16_gt_126:
240; CHECK:       ; %bb.0:
241; CHECK-NEXT:    ldi r18, 1
242; CHECK-NEXT:    cpi r24, 127
243; CHECK-NEXT:    cpc r25, r1
244; CHECK-NEXT:    brge .LBB12_2
245; CHECK-NEXT:  ; %bb.1:
246; CHECK-NEXT:    mov r18, r1
247; CHECK-NEXT:  .LBB12_2:
248; CHECK-NEXT:    mov r24, r18
249; CHECK-NEXT:    clr r25
250; CHECK-NEXT:    ret
251;
252; TINY-LABEL: cmp_i16_gt_126:
253; TINY:       ; %bb.0:
254; TINY-NEXT:    ldi r20, 1
255; TINY-NEXT:    cpi r24, 127
256; TINY-NEXT:    cpc r25, r17
257; TINY-NEXT:    brge .LBB12_2
258; TINY-NEXT:  ; %bb.1:
259; TINY-NEXT:    mov r20, r17
260; TINY-NEXT:  .LBB12_2:
261; TINY-NEXT:    mov r24, r20
262; TINY-NEXT:    clr r25
263; TINY-NEXT:    ret
264  %2 = icmp sgt i16 %0, 126
265  %3 = zext i1 %2 to i16
266  ret i16 %3
267}
268
269define i16 @cmp_i16_gt_1023(i16 %0) {
270; CHECK-LABEL: cmp_i16_gt_1023:
271; CHECK:       ; %bb.0:
272; CHECK-NEXT:    ldi r19, 4
273; CHECK-NEXT:    ldi r18, 1
274; CHECK-NEXT:    cp r24, r1
275; CHECK-NEXT:    cpc r25, r19
276; CHECK-NEXT:    brge .LBB13_2
277; CHECK-NEXT:  ; %bb.1:
278; CHECK-NEXT:    mov r18, r1
279; CHECK-NEXT:  .LBB13_2:
280; CHECK-NEXT:    mov r24, r18
281; CHECK-NEXT:    clr r25
282; CHECK-NEXT:    ret
283;
284; TINY-LABEL: cmp_i16_gt_1023:
285; TINY:       ; %bb.0:
286; TINY-NEXT:    ldi r21, 4
287; TINY-NEXT:    ldi r20, 1
288; TINY-NEXT:    cp r24, r17
289; TINY-NEXT:    cpc r25, r21
290; TINY-NEXT:    brge .LBB13_2
291; TINY-NEXT:  ; %bb.1:
292; TINY-NEXT:    mov r20, r17
293; TINY-NEXT:  .LBB13_2:
294; TINY-NEXT:    mov r24, r20
295; TINY-NEXT:    clr r25
296; TINY-NEXT:    ret
297  %2 = icmp sgt i16 %0, 1023
298  %3 = zext i1 %2 to i16
299  ret i16 %3
300}
301