1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -mattr=+2e3 | FileCheck %s
3
4;eq
5define i1 @icmpRR_eq(i32 %x, i32 %y) {
6; CHECK-LABEL: icmpRR_eq:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    cmpne16 a1, a0
9; CHECK-NEXT:    mvcv16 a0
10; CHECK-NEXT:    rts16
11entry:
12  %icmp = icmp eq i32 %y, %x
13  ret i1 %icmp
14}
15
16define i1 @icmpRI_eq(i32 %x) {
17; CHECK-LABEL: icmpRI_eq:
18; CHECK:       # %bb.0: # %entry
19; CHECK-NEXT:    cmpnei16 a0, 10
20; CHECK-NEXT:    mvcv16 a0
21; CHECK-NEXT:    rts16
22entry:
23  %icmp = icmp eq i32 %x, 10
24  ret i1 %icmp
25}
26
27define i1 @icmpRI_X_eq(i32 %x) {
28; CHECK-LABEL: icmpRI_X_eq:
29; CHECK:       # %bb.0: # %entry
30; CHECK-NEXT:    movih32 a1, 62
31; CHECK-NEXT:    ori32 a1, a1, 33768
32; CHECK-NEXT:    cmpne16 a0, a1
33; CHECK-NEXT:    mvcv16 a0
34; CHECK-NEXT:    rts16
35entry:
36  %icmp = icmp eq i32 %x, 4097000
37  ret i1 %icmp
38}
39
40define i1 @ICMP_LONG_eq(i64 %x, i64 %y) {
41; CHECK-LABEL: ICMP_LONG_eq:
42; CHECK:       # %bb.0: # %entry
43; CHECK-NEXT:    xor16 a1, a3
44; CHECK-NEXT:    xor16 a0, a2
45; CHECK-NEXT:    or16 a0, a1
46; CHECK-NEXT:    cmpnei16 a0, 0
47; CHECK-NEXT:    mvcv16 a0
48; CHECK-NEXT:    rts16
49entry:
50  %icmp = icmp eq i64 %y, %x
51  ret i1 %icmp
52}
53
54define i1 @ICMP_LONG_I_eq(i64 %x) {
55; CHECK-LABEL: ICMP_LONG_I_eq:
56; CHECK:       # %bb.0: # %entry
57; CHECK-NEXT:    xori32 a0, a0, 1
58; CHECK-NEXT:    or16 a0, a1
59; CHECK-NEXT:    cmpnei16 a0, 0
60; CHECK-NEXT:    mvcv16 a0
61; CHECK-NEXT:    rts16
62entry:
63  %icmp = icmp eq i64 %x, 1
64  ret i1 %icmp
65}
66
67define i1 @ICMP_SHORT_eq(i16 %x, i16 %y) {
68; CHECK-LABEL: ICMP_SHORT_eq:
69; CHECK:       # %bb.0: # %entry
70; CHECK-NEXT:    zexth16 a0, a0
71; CHECK-NEXT:    zexth16 a1, a1
72; CHECK-NEXT:    cmpne16 a1, a0
73; CHECK-NEXT:    mvcv16 a0
74; CHECK-NEXT:    rts16
75entry:
76  %icmp = icmp eq i16 %y, %x
77  ret i1 %icmp
78}
79
80define i1 @ICMP_SHORT_I_eq(i16 %x) {
81; CHECK-LABEL: ICMP_SHORT_I_eq:
82; CHECK:       # %bb.0: # %entry
83; CHECK-NEXT:    zexth16 a0, a0
84; CHECK-NEXT:    cmpnei16 a0, 1
85; CHECK-NEXT:    mvcv16 a0
86; CHECK-NEXT:    rts16
87entry:
88  %icmp = icmp eq i16 %x, 1
89  ret i1 %icmp
90}
91
92define i1 @ICMP_CHAR_eq(i8 %x, i8 %y) {
93; CHECK-LABEL: ICMP_CHAR_eq:
94; CHECK:       # %bb.0: # %entry
95; CHECK-NEXT:    zextb16 a0, a0
96; CHECK-NEXT:    zextb16 a1, a1
97; CHECK-NEXT:    cmpne16 a1, a0
98; CHECK-NEXT:    mvcv16 a0
99; CHECK-NEXT:    rts16
100entry:
101  %icmp = icmp eq i8 %y, %x
102  ret i1 %icmp
103}
104
105define i1 @ICMP_CHAR_I_eq(i8 %x) {
106; CHECK-LABEL: ICMP_CHAR_I_eq:
107; CHECK:       # %bb.0: # %entry
108; CHECK-NEXT:    zextb16 a0, a0
109; CHECK-NEXT:    cmpnei16 a0, 1
110; CHECK-NEXT:    mvcv16 a0
111; CHECK-NEXT:    rts16
112entry:
113  %icmp = icmp eq i8 %x, 1
114  ret i1 %icmp
115}
116
117define i1 @ICMP_BIT_eq(i1 %x, i1 %y) {
118; CHECK-LABEL: ICMP_BIT_eq:
119; CHECK:       # %bb.0: # %entry
120; CHECK-NEXT:    xor16 a0, a1
121; CHECK-NEXT:    xori32 a0, a0, 1
122; CHECK-NEXT:    rts16
123entry:
124  %icmp = icmp eq i1 %y, %x
125  ret i1 %icmp
126}
127
128define i1 @ICMP_BIT_I_eq(i1 %x) {
129; CHECK-LABEL: ICMP_BIT_I_eq:
130; CHECK:       # %bb.0: # %entry
131; CHECK-NEXT:    rts16
132entry:
133  %icmp = icmp eq i1 %x, 1
134  ret i1 %icmp
135}
136
137;ne
138define i1 @icmpRR_ne(i32 %x, i32 %y) {
139; CHECK-LABEL: icmpRR_ne:
140; CHECK:       # %bb.0: # %entry
141; CHECK-NEXT:    cmpne16 a1, a0
142; CHECK-NEXT:    mvc32 a0
143; CHECK-NEXT:    rts16
144entry:
145  %icmp = icmp ne i32 %y, %x
146  ret i1 %icmp
147}
148
149define i1 @icmpRI_ne(i32 %x) {
150; CHECK-LABEL: icmpRI_ne:
151; CHECK:       # %bb.0: # %entry
152; CHECK-NEXT:    cmpnei16 a0, 10
153; CHECK-NEXT:    mvc32 a0
154; CHECK-NEXT:    rts16
155entry:
156  %icmp = icmp ne i32 %x, 10
157  ret i1 %icmp
158}
159
160define i1 @icmpRI_X_ne(i32 %x) {
161; CHECK-LABEL: icmpRI_X_ne:
162; CHECK:       # %bb.0: # %entry
163; CHECK-NEXT:    movih32 a1, 62
164; CHECK-NEXT:    ori32 a1, a1, 33768
165; CHECK-NEXT:    cmpne16 a0, a1
166; CHECK-NEXT:    mvc32 a0
167; CHECK-NEXT:    rts16
168entry:
169  %icmp = icmp ne i32 %x, 4097000
170  ret i1 %icmp
171}
172
173define i1 @ICMP_LONG_ne(i64 %x, i64 %y) {
174; CHECK-LABEL: ICMP_LONG_ne:
175; CHECK:       # %bb.0: # %entry
176; CHECK-NEXT:    xor16 a1, a3
177; CHECK-NEXT:    xor16 a0, a2
178; CHECK-NEXT:    or16 a0, a1
179; CHECK-NEXT:    cmpnei16 a0, 0
180; CHECK-NEXT:    mvc32 a0
181; CHECK-NEXT:    rts16
182entry:
183  %icmp = icmp ne i64 %y, %x
184  ret i1 %icmp
185}
186
187define i1 @ICMP_LONG_I_ne(i64 %x) {
188; CHECK-LABEL: ICMP_LONG_I_ne:
189; CHECK:       # %bb.0: # %entry
190; CHECK-NEXT:    xori32 a0, a0, 1
191; CHECK-NEXT:    or16 a0, a1
192; CHECK-NEXT:    cmpnei16 a0, 0
193; CHECK-NEXT:    mvc32 a0
194; CHECK-NEXT:    rts16
195entry:
196  %icmp = icmp ne i64 %x, 1
197  ret i1 %icmp
198}
199
200define i1 @ICMP_SHORT_ne(i16 %x, i16 %y) {
201; CHECK-LABEL: ICMP_SHORT_ne:
202; CHECK:       # %bb.0: # %entry
203; CHECK-NEXT:    zexth16 a0, a0
204; CHECK-NEXT:    zexth16 a1, a1
205; CHECK-NEXT:    cmpne16 a1, a0
206; CHECK-NEXT:    mvc32 a0
207; CHECK-NEXT:    rts16
208entry:
209  %icmp = icmp ne i16 %y, %x
210  ret i1 %icmp
211}
212
213define i1 @ICMP_SHORT_I_ne(i16 %x) {
214; CHECK-LABEL: ICMP_SHORT_I_ne:
215; CHECK:       # %bb.0: # %entry
216; CHECK-NEXT:    zexth16 a0, a0
217; CHECK-NEXT:    cmpnei16 a0, 1
218; CHECK-NEXT:    mvc32 a0
219; CHECK-NEXT:    rts16
220entry:
221  %icmp = icmp ne i16 %x, 1
222  ret i1 %icmp
223}
224
225define i1 @ICMP_CHAR_ne(i8 %x, i8 %y) {
226; CHECK-LABEL: ICMP_CHAR_ne:
227; CHECK:       # %bb.0: # %entry
228; CHECK-NEXT:    zextb16 a0, a0
229; CHECK-NEXT:    zextb16 a1, a1
230; CHECK-NEXT:    cmpne16 a1, a0
231; CHECK-NEXT:    mvc32 a0
232; CHECK-NEXT:    rts16
233entry:
234  %icmp = icmp ne i8 %y, %x
235  ret i1 %icmp
236}
237
238define i1 @ICMP_CHAR_I_ne(i8 %x) {
239; CHECK-LABEL: ICMP_CHAR_I_ne:
240; CHECK:       # %bb.0: # %entry
241; CHECK-NEXT:    zextb16 a0, a0
242; CHECK-NEXT:    cmpnei16 a0, 1
243; CHECK-NEXT:    mvc32 a0
244; CHECK-NEXT:    rts16
245entry:
246  %icmp = icmp ne i8 %x, 1
247  ret i1 %icmp
248}
249
250define i1 @ICMP_BIT_ne(i1 %x, i1 %y) {
251; CHECK-LABEL: ICMP_BIT_ne:
252; CHECK:       # %bb.0: # %entry
253; CHECK-NEXT:    xor16 a0, a1
254; CHECK-NEXT:    rts16
255entry:
256  %icmp = icmp ne i1 %y, %x
257  ret i1 %icmp
258}
259
260define i1 @ICMP_BIT_I_ne(i1 %x) {
261; CHECK-LABEL: ICMP_BIT_I_ne:
262; CHECK:       # %bb.0: # %entry
263; CHECK-NEXT:    xori32 a0, a0, 1
264; CHECK-NEXT:    rts16
265entry:
266  %icmp = icmp ne i1 %x, 1
267  ret i1 %icmp
268}
269
270
271;ugt
272define i1 @icmpRR_ugt(i32 %x, i32 %y) {
273; CHECK-LABEL: icmpRR_ugt:
274; CHECK:       # %bb.0: # %entry
275; CHECK-NEXT:    cmphs16 a0, a1
276; CHECK-NEXT:    mvcv16 a0
277; CHECK-NEXT:    rts16
278entry:
279  %icmp = icmp ugt i32 %y, %x
280  ret i1 %icmp
281}
282
283define i1 @icmpRI_ugt(i32 %x) {
284; CHECK-LABEL: icmpRI_ugt:
285; CHECK:       # %bb.0: # %entry
286; CHECK-NEXT:    movi16 a1, 10
287; CHECK-NEXT:    cmphs16 a1, a0
288; CHECK-NEXT:    mvcv16 a0
289; CHECK-NEXT:    rts16
290entry:
291  %icmp = icmp ugt i32 %x, 10
292  ret i1 %icmp
293}
294
295define i1 @icmpRI_X_ugt(i32 %x) {
296; CHECK-LABEL: icmpRI_X_ugt:
297; CHECK:       # %bb.0: # %entry
298; CHECK-NEXT:    movih32 a1, 62
299; CHECK-NEXT:    ori32 a1, a1, 33768
300; CHECK-NEXT:    cmphs16 a1, a0
301; CHECK-NEXT:    mvcv16 a0
302; CHECK-NEXT:    rts16
303entry:
304  %icmp = icmp ugt i32 %x, 4097000
305  ret i1 %icmp
306}
307
308define i1 @ICMP_LONG_ugt(i64 %x, i64 %y) {
309; CHECK-LABEL: ICMP_LONG_ugt:
310; CHECK:       # %bb.0: # %entry
311; CHECK-NEXT:    .cfi_def_cfa_offset 0
312; CHECK-NEXT:    subi16 sp, sp, 8
313; CHECK-NEXT:    .cfi_def_cfa_offset 8
314; CHECK-NEXT:    cmpne16 a3, a1
315; CHECK-NEXT:    mvc32 t0
316; CHECK-NEXT:    st32.w t0, (sp, 4)
317; CHECK-NEXT:    cmphs16 a1, a3
318; CHECK-NEXT:    mvcv16 a1
319; CHECK-NEXT:    cmphs16 a0, a2
320; CHECK-NEXT:    mvcv16 a0
321; CHECK-NEXT:    ld16.w a2, (sp, 4)
322; CHECK-NEXT:    btsti32 a2, 0
323; CHECK-NEXT:    movf32 a1, a0
324; CHECK-NEXT:    mov16 a0, a1
325; CHECK-NEXT:    addi16 sp, sp, 8
326; CHECK-NEXT:    rts16
327entry:
328  %icmp = icmp ugt i64 %y, %x
329  ret i1 %icmp
330}
331
332define i1 @ICMP_LONG_I_ugt(i64 %x) {
333; CHECK-LABEL: ICMP_LONG_I_ugt:
334; CHECK:       # %bb.0: # %entry
335; CHECK-NEXT:    movi16 a2, 1
336; CHECK-NEXT:    cmphs16 a2, a0
337; CHECK-NEXT:    mvcv16 a2
338; CHECK-NEXT:    cmpnei16 a1, 0
339; CHECK-NEXT:    mvc32 a0
340; CHECK-NEXT:    movf32 a0, a2
341; CHECK-NEXT:    rts16
342entry:
343  %icmp = icmp ugt i64 %x, 1
344  ret i1 %icmp
345}
346
347define i1 @ICMP_SHORT_ugt(i16 %x, i16 %y) {
348; CHECK-LABEL: ICMP_SHORT_ugt:
349; CHECK:       # %bb.0: # %entry
350; CHECK-NEXT:    zexth16 a1, a1
351; CHECK-NEXT:    zexth16 a0, a0
352; CHECK-NEXT:    cmphs16 a0, a1
353; CHECK-NEXT:    mvcv16 a0
354; CHECK-NEXT:    rts16
355entry:
356  %icmp = icmp ugt i16 %y, %x
357  ret i1 %icmp
358}
359
360define i1 @ICMP_SHORT_I_ugt(i16 %x) {
361; CHECK-LABEL: ICMP_SHORT_I_ugt:
362; CHECK:       # %bb.0: # %entry
363; CHECK-NEXT:    zexth16 a0, a0
364; CHECK-NEXT:    movi16 a1, 1
365; CHECK-NEXT:    cmphs16 a1, a0
366; CHECK-NEXT:    mvcv16 a0
367; CHECK-NEXT:    rts16
368entry:
369  %icmp = icmp ugt i16 %x, 1
370  ret i1 %icmp
371}
372
373define i1 @ICMP_CHAR_ugt(i8 %x, i8 %y) {
374; CHECK-LABEL: ICMP_CHAR_ugt:
375; CHECK:       # %bb.0: # %entry
376; CHECK-NEXT:    zextb16 a1, a1
377; CHECK-NEXT:    zextb16 a0, a0
378; CHECK-NEXT:    cmphs16 a0, a1
379; CHECK-NEXT:    mvcv16 a0
380; CHECK-NEXT:    rts16
381entry:
382  %icmp = icmp ugt i8 %y, %x
383  ret i1 %icmp
384}
385
386define i1 @ICMP_CHAR_I_ugt(i8 %x) {
387; CHECK-LABEL: ICMP_CHAR_I_ugt:
388; CHECK:       # %bb.0: # %entry
389; CHECK-NEXT:    zextb16 a0, a0
390; CHECK-NEXT:    movi16 a1, 1
391; CHECK-NEXT:    cmphs16 a1, a0
392; CHECK-NEXT:    mvcv16 a0
393; CHECK-NEXT:    rts16
394entry:
395  %icmp = icmp ugt i8 %x, 1
396  ret i1 %icmp
397}
398
399define i1 @ICMP_BIT_ugt(i1 %x, i1 %y) {
400; CHECK-LABEL: ICMP_BIT_ugt:
401; CHECK:       # %bb.0: # %entry
402; CHECK-NEXT:    xori32 a0, a0, 1
403; CHECK-NEXT:    and16 a0, a1
404; CHECK-NEXT:    rts16
405entry:
406  %icmp = icmp ugt i1 %y, %x
407  ret i1 %icmp
408}
409
410define i1 @ICMP_BIT_I_ugt(i1 %x) {
411; CHECK-LABEL: ICMP_BIT_I_ugt:
412; CHECK:       # %bb.0: # %entry
413; CHECK-NEXT:    movi16 a0, 0
414; CHECK-NEXT:    rts16
415entry:
416  %icmp = icmp ugt i1 %x, 1
417  ret i1 %icmp
418}
419
420
421;uge
422define i1 @icmpRR_uge(i32 %x, i32 %y) {
423; CHECK-LABEL: icmpRR_uge:
424; CHECK:       # %bb.0: # %entry
425; CHECK-NEXT:    cmphs16 a1, a0
426; CHECK-NEXT:    mvc32 a0
427; CHECK-NEXT:    rts16
428entry:
429  %icmp = icmp uge i32 %y, %x
430  ret i1 %icmp
431}
432
433define i1 @icmpRI_uge(i32 %x) {
434; CHECK-LABEL: icmpRI_uge:
435; CHECK:       # %bb.0: # %entry
436; CHECK-NEXT:    movi16 a1, 9
437; CHECK-NEXT:    cmphs16 a1, a0
438; CHECK-NEXT:    mvcv16 a0
439; CHECK-NEXT:    rts16
440entry:
441  %icmp = icmp uge i32 %x, 10
442  ret i1 %icmp
443}
444
445define i1 @icmpRI_X_uge(i32 %x) {
446; CHECK-LABEL: icmpRI_X_uge:
447; CHECK:       # %bb.0: # %entry
448; CHECK-NEXT:    movih32 a1, 62
449; CHECK-NEXT:    ori32 a1, a1, 33767
450; CHECK-NEXT:    cmphs16 a1, a0
451; CHECK-NEXT:    mvcv16 a0
452; CHECK-NEXT:    rts16
453entry:
454  %icmp = icmp uge i32 %x, 4097000
455  ret i1 %icmp
456}
457
458define i1 @ICMP_LONG_uge(i64 %x, i64 %y) {
459; CHECK-LABEL: ICMP_LONG_uge:
460; CHECK:       # %bb.0: # %entry
461; CHECK-NEXT:    .cfi_def_cfa_offset 0
462; CHECK-NEXT:    subi16 sp, sp, 16
463; CHECK-NEXT:    .cfi_def_cfa_offset 16
464; CHECK-NEXT:    cmphs16 a3, a1
465; CHECK-NEXT:    mvc32 t0
466; CHECK-NEXT:    st32.w t0, (sp, 12)
467; CHECK-NEXT:    cmphs16 a2, a0
468; CHECK-NEXT:    mvc32 a0
469; CHECK-NEXT:    st16.w a0, (sp, 4)
470; CHECK-NEXT:    cmpne16 a3, a1
471; CHECK-NEXT:    mvc32 a0
472; CHECK-NEXT:    st16.w a0, (sp, 8)
473; CHECK-NEXT:    ld16.w a0, (sp, 4)
474; CHECK-NEXT:    btsti32 a0, 0
475; CHECK-NEXT:    mvc32 a1
476; CHECK-NEXT:    ld16.w a0, (sp, 12)
477; CHECK-NEXT:    btsti32 a0, 0
478; CHECK-NEXT:    mvc32 a0
479; CHECK-NEXT:    ld16.w a2, (sp, 8)
480; CHECK-NEXT:    btsti32 a2, 0
481; CHECK-NEXT:    movf32 a0, a1
482; CHECK-NEXT:    addi16 sp, sp, 16
483; CHECK-NEXT:    rts16
484entry:
485  %icmp = icmp uge i64 %y, %x
486  ret i1 %icmp
487}
488
489define i1 @ICMP_LONG_I_uge(i64 %x) {
490; CHECK-LABEL: ICMP_LONG_I_uge:
491; CHECK:       # %bb.0: # %entry
492; CHECK-NEXT:    or16 a0, a1
493; CHECK-NEXT:    cmpnei16 a0, 0
494; CHECK-NEXT:    mvc32 a0
495; CHECK-NEXT:    rts16
496entry:
497  %icmp = icmp uge i64 %x, 1
498  ret i1 %icmp
499}
500
501define i1 @ICMP_SHORT_uge(i16 %x, i16 %y) {
502; CHECK-LABEL: ICMP_SHORT_uge:
503; CHECK:       # %bb.0: # %entry
504; CHECK-NEXT:    zexth16 a0, a0
505; CHECK-NEXT:    zexth16 a1, a1
506; CHECK-NEXT:    cmphs16 a1, a0
507; CHECK-NEXT:    mvc32 a0
508; CHECK-NEXT:    rts16
509entry:
510  %icmp = icmp uge i16 %y, %x
511  ret i1 %icmp
512}
513
514define i1 @ICMP_SHORT_I_uge(i16 %x) {
515; CHECK-LABEL: ICMP_SHORT_I_uge:
516; CHECK:       # %bb.0: # %entry
517; CHECK-NEXT:    zexth16 a0, a0
518; CHECK-NEXT:    cmpnei16 a0, 0
519; CHECK-NEXT:    mvc32 a0
520; CHECK-NEXT:    rts16
521entry:
522  %icmp = icmp uge i16 %x, 1
523  ret i1 %icmp
524}
525
526define i1 @ICMP_CHAR_uge(i8 %x, i8 %y) {
527; CHECK-LABEL: ICMP_CHAR_uge:
528; CHECK:       # %bb.0: # %entry
529; CHECK-NEXT:    zextb16 a0, a0
530; CHECK-NEXT:    zextb16 a1, a1
531; CHECK-NEXT:    cmphs16 a1, a0
532; CHECK-NEXT:    mvc32 a0
533; CHECK-NEXT:    rts16
534entry:
535  %icmp = icmp uge i8 %y, %x
536  ret i1 %icmp
537}
538
539define i1 @ICMP_CHAR_I_uge(i8 %x) {
540; CHECK-LABEL: ICMP_CHAR_I_uge:
541; CHECK:       # %bb.0: # %entry
542; CHECK-NEXT:    zextb16 a0, a0
543; CHECK-NEXT:    cmpnei16 a0, 0
544; CHECK-NEXT:    mvc32 a0
545; CHECK-NEXT:    rts16
546entry:
547  %icmp = icmp uge i8 %x, 1
548  ret i1 %icmp
549}
550
551define i1 @ICMP_BIT_uge(i1 %x, i1 %y) {
552; CHECK-LABEL: ICMP_BIT_uge:
553; CHECK:       # %bb.0: # %entry
554; CHECK-NEXT:    xori32 a0, a0, 1
555; CHECK-NEXT:    or16 a0, a1
556; CHECK-NEXT:    rts16
557entry:
558  %icmp = icmp uge i1 %y, %x
559  ret i1 %icmp
560}
561
562define i1 @ICMP_BIT_I_uge(i1 %x) {
563; CHECK-LABEL: ICMP_BIT_I_uge:
564; CHECK:       # %bb.0: # %entry
565; CHECK-NEXT:    rts16
566entry:
567  %icmp = icmp uge i1 %x, 1
568  ret i1 %icmp
569}
570
571
572;ult
573define i1 @icmpRR_ult(i32 %x, i32 %y) {
574; CHECK-LABEL: icmpRR_ult:
575; CHECK:       # %bb.0: # %entry
576; CHECK-NEXT:    cmphs16 a1, a0
577; CHECK-NEXT:    mvcv16 a0
578; CHECK-NEXT:    rts16
579entry:
580  %icmp = icmp ult i32 %y, %x
581  ret i1 %icmp
582}
583
584define i1 @icmpRI_ult(i32 %x) {
585; CHECK-LABEL: icmpRI_ult:
586; CHECK:       # %bb.0: # %entry
587; CHECK-NEXT:    cmphsi16 a0, 10
588; CHECK-NEXT:    mvcv16 a0
589; CHECK-NEXT:    rts16
590entry:
591  %icmp = icmp ult i32 %x, 10
592  ret i1 %icmp
593}
594
595define i1 @icmpRI_X_ult(i32 %x) {
596; CHECK-LABEL: icmpRI_X_ult:
597; CHECK:       # %bb.0: # %entry
598; CHECK-NEXT:    movih32 a1, 62
599; CHECK-NEXT:    ori32 a1, a1, 33768
600; CHECK-NEXT:    cmphs16 a0, a1
601; CHECK-NEXT:    mvcv16 a0
602; CHECK-NEXT:    rts16
603entry:
604  %icmp = icmp ult i32 %x, 4097000
605  ret i1 %icmp
606}
607
608define i1 @ICMP_LONG_ult(i64 %x, i64 %y) {
609; CHECK-LABEL: ICMP_LONG_ult:
610; CHECK:       # %bb.0: # %entry
611; CHECK-NEXT:    .cfi_def_cfa_offset 0
612; CHECK-NEXT:    subi16 sp, sp, 8
613; CHECK-NEXT:    .cfi_def_cfa_offset 8
614; CHECK-NEXT:    cmpne16 a3, a1
615; CHECK-NEXT:    mvc32 t0
616; CHECK-NEXT:    st32.w t0, (sp, 4)
617; CHECK-NEXT:    cmphs16 a3, a1
618; CHECK-NEXT:    mvcv16 a1
619; CHECK-NEXT:    cmphs16 a2, a0
620; CHECK-NEXT:    mvcv16 a0
621; CHECK-NEXT:    ld16.w a2, (sp, 4)
622; CHECK-NEXT:    btsti32 a2, 0
623; CHECK-NEXT:    movf32 a1, a0
624; CHECK-NEXT:    mov16 a0, a1
625; CHECK-NEXT:    addi16 sp, sp, 8
626; CHECK-NEXT:    rts16
627entry:
628  %icmp = icmp ult i64 %y, %x
629  ret i1 %icmp
630}
631
632define i1 @ICMP_LONG_I_ult(i64 %x) {
633; CHECK-LABEL: ICMP_LONG_I_ult:
634; CHECK:       # %bb.0: # %entry
635; CHECK-NEXT:    or16 a0, a1
636; CHECK-NEXT:    cmpnei16 a0, 0
637; CHECK-NEXT:    mvcv16 a0
638; CHECK-NEXT:    rts16
639entry:
640  %icmp = icmp ult i64 %x, 1
641  ret i1 %icmp
642}
643
644define i1 @ICMP_SHORT_ult(i16 %x, i16 %y) {
645; CHECK-LABEL: ICMP_SHORT_ult:
646; CHECK:       # %bb.0: # %entry
647; CHECK-NEXT:    zexth16 a0, a0
648; CHECK-NEXT:    zexth16 a1, a1
649; CHECK-NEXT:    cmphs16 a1, a0
650; CHECK-NEXT:    mvcv16 a0
651; CHECK-NEXT:    rts16
652entry:
653  %icmp = icmp ult i16 %y, %x
654  ret i1 %icmp
655}
656
657define i1 @ICMP_SHORT_I_ult(i16 %x) {
658; CHECK-LABEL: ICMP_SHORT_I_ult:
659; CHECK:       # %bb.0: # %entry
660; CHECK-NEXT:    zexth16 a0, a0
661; CHECK-NEXT:    cmpnei16 a0, 0
662; CHECK-NEXT:    mvcv16 a0
663; CHECK-NEXT:    rts16
664entry:
665  %icmp = icmp ult i16 %x, 1
666  ret i1 %icmp
667}
668
669define i1 @ICMP_CHAR_ult(i8 %x, i8 %y) {
670; CHECK-LABEL: ICMP_CHAR_ult:
671; CHECK:       # %bb.0: # %entry
672; CHECK-NEXT:    zextb16 a0, a0
673; CHECK-NEXT:    zextb16 a1, a1
674; CHECK-NEXT:    cmphs16 a1, a0
675; CHECK-NEXT:    mvcv16 a0
676; CHECK-NEXT:    rts16
677entry:
678  %icmp = icmp ult i8 %y, %x
679  ret i1 %icmp
680}
681
682define i1 @ICMP_CHAR_I_ult(i8 %x) {
683; CHECK-LABEL: ICMP_CHAR_I_ult:
684; CHECK:       # %bb.0: # %entry
685; CHECK-NEXT:    zextb16 a0, a0
686; CHECK-NEXT:    cmpnei16 a0, 0
687; CHECK-NEXT:    mvcv16 a0
688; CHECK-NEXT:    rts16
689entry:
690  %icmp = icmp ult i8 %x, 1
691  ret i1 %icmp
692}
693
694define i1 @ICMP_BIT_ult(i1 %x, i1 %y) {
695; CHECK-LABEL: ICMP_BIT_ult:
696; CHECK:       # %bb.0: # %entry
697; CHECK-NEXT:    xori32 a1, a1, 1
698; CHECK-NEXT:    and16 a0, a1
699; CHECK-NEXT:    rts16
700entry:
701  %icmp = icmp ult i1 %y, %x
702  ret i1 %icmp
703}
704
705define i1 @ICMP_BIT_I_ult(i1 %x) {
706; CHECK-LABEL: ICMP_BIT_I_ult:
707; CHECK:       # %bb.0: # %entry
708; CHECK-NEXT:    xori32 a0, a0, 1
709; CHECK-NEXT:    rts16
710entry:
711  %icmp = icmp ult i1 %x, 1
712  ret i1 %icmp
713}
714
715
716;ule
717define i1 @icmpRR_ule(i32 %x, i32 %y) {
718; CHECK-LABEL: icmpRR_ule:
719; CHECK:       # %bb.0: # %entry
720; CHECK-NEXT:    cmphs16 a0, a1
721; CHECK-NEXT:    mvc32 a0
722; CHECK-NEXT:    rts16
723entry:
724  %icmp = icmp ule i32 %y, %x
725  ret i1 %icmp
726}
727
728define i1 @icmpRI_ule(i32 %x) {
729; CHECK-LABEL: icmpRI_ule:
730; CHECK:       # %bb.0: # %entry
731; CHECK-NEXT:    cmphsi16 a0, 11
732; CHECK-NEXT:    mvcv16 a0
733; CHECK-NEXT:    rts16
734entry:
735  %icmp = icmp ule i32 %x, 10
736  ret i1 %icmp
737}
738
739define i1 @icmpRI_X_ule(i32 %x) {
740; CHECK-LABEL: icmpRI_X_ule:
741; CHECK:       # %bb.0: # %entry
742; CHECK-NEXT:    movih32 a1, 62
743; CHECK-NEXT:    ori32 a1, a1, 33769
744; CHECK-NEXT:    cmphs16 a0, a1
745; CHECK-NEXT:    mvcv16 a0
746; CHECK-NEXT:    rts16
747entry:
748  %icmp = icmp ule i32 %x, 4097000
749  ret i1 %icmp
750}
751
752define i1 @ICMP_LONG_ule(i64 %x, i64 %y) {
753; CHECK-LABEL: ICMP_LONG_ule:
754; CHECK:       # %bb.0: # %entry
755; CHECK-NEXT:    .cfi_def_cfa_offset 0
756; CHECK-NEXT:    subi16 sp, sp, 16
757; CHECK-NEXT:    .cfi_def_cfa_offset 16
758; CHECK-NEXT:    cmphs16 a1, a3
759; CHECK-NEXT:    mvc32 t0
760; CHECK-NEXT:    st32.w t0, (sp, 12)
761; CHECK-NEXT:    cmphs16 a0, a2
762; CHECK-NEXT:    mvc32 a0
763; CHECK-NEXT:    st16.w a0, (sp, 4)
764; CHECK-NEXT:    cmpne16 a3, a1
765; CHECK-NEXT:    mvc32 a0
766; CHECK-NEXT:    st16.w a0, (sp, 8)
767; CHECK-NEXT:    ld16.w a0, (sp, 4)
768; CHECK-NEXT:    btsti32 a0, 0
769; CHECK-NEXT:    mvc32 a1
770; CHECK-NEXT:    ld16.w a0, (sp, 12)
771; CHECK-NEXT:    btsti32 a0, 0
772; CHECK-NEXT:    mvc32 a0
773; CHECK-NEXT:    ld16.w a2, (sp, 8)
774; CHECK-NEXT:    btsti32 a2, 0
775; CHECK-NEXT:    movf32 a0, a1
776; CHECK-NEXT:    addi16 sp, sp, 16
777; CHECK-NEXT:    rts16
778entry:
779  %icmp = icmp ule i64 %y, %x
780  ret i1 %icmp
781}
782
783define i1 @ICMP_LONG_I_ule(i64 %x) {
784; CHECK-LABEL: ICMP_LONG_I_ule:
785; CHECK:       # %bb.0: # %entry
786; CHECK-NEXT:    .cfi_def_cfa_offset 0
787; CHECK-NEXT:    subi16 sp, sp, 8
788; CHECK-NEXT:    .cfi_def_cfa_offset 8
789; CHECK-NEXT:    cmpnei16 a1, 0
790; CHECK-NEXT:    mvc32 a1
791; CHECK-NEXT:    st16.w a1, (sp, 4)
792; CHECK-NEXT:    cmphsi16 a0, 2
793; CHECK-NEXT:    mvcv16 a1
794; CHECK-NEXT:    movi16 a0, 0
795; CHECK-NEXT:    ld16.w a2, (sp, 4)
796; CHECK-NEXT:    btsti32 a2, 0
797; CHECK-NEXT:    movf32 a0, a1
798; CHECK-NEXT:    addi16 sp, sp, 8
799; CHECK-NEXT:    rts16
800entry:
801  %icmp = icmp ule i64 %x, 1
802  ret i1 %icmp
803}
804
805define i1 @ICMP_SHORT_ule(i16 %x, i16 %y) {
806; CHECK-LABEL: ICMP_SHORT_ule:
807; CHECK:       # %bb.0: # %entry
808; CHECK-NEXT:    zexth16 a1, a1
809; CHECK-NEXT:    zexth16 a0, a0
810; CHECK-NEXT:    cmphs16 a0, a1
811; CHECK-NEXT:    mvc32 a0
812; CHECK-NEXT:    rts16
813entry:
814  %icmp = icmp ule i16 %y, %x
815  ret i1 %icmp
816}
817
818define i1 @ICMP_SHORT_I_ule(i16 %x) {
819; CHECK-LABEL: ICMP_SHORT_I_ule:
820; CHECK:       # %bb.0: # %entry
821; CHECK-NEXT:    zexth16 a0, a0
822; CHECK-NEXT:    cmphsi16 a0, 2
823; CHECK-NEXT:    mvcv16 a0
824; CHECK-NEXT:    rts16
825entry:
826  %icmp = icmp ule i16 %x, 1
827  ret i1 %icmp
828}
829
830define i1 @ICMP_CHAR_ule(i8 %x, i8 %y) {
831; CHECK-LABEL: ICMP_CHAR_ule:
832; CHECK:       # %bb.0: # %entry
833; CHECK-NEXT:    zextb16 a1, a1
834; CHECK-NEXT:    zextb16 a0, a0
835; CHECK-NEXT:    cmphs16 a0, a1
836; CHECK-NEXT:    mvc32 a0
837; CHECK-NEXT:    rts16
838entry:
839  %icmp = icmp ule i8 %y, %x
840  ret i1 %icmp
841}
842
843define i1 @ICMP_CHAR_I_ule(i8 %x) {
844; CHECK-LABEL: ICMP_CHAR_I_ule:
845; CHECK:       # %bb.0: # %entry
846; CHECK-NEXT:    zextb16 a0, a0
847; CHECK-NEXT:    cmphsi16 a0, 2
848; CHECK-NEXT:    mvcv16 a0
849; CHECK-NEXT:    rts16
850entry:
851  %icmp = icmp ule i8 %x, 1
852  ret i1 %icmp
853}
854
855define i1 @ICMP_BIT_ule(i1 %x, i1 %y) {
856; CHECK-LABEL: ICMP_BIT_ule:
857; CHECK:       # %bb.0: # %entry
858; CHECK-NEXT:    xori32 a1, a1, 1
859; CHECK-NEXT:    or16 a0, a1
860; CHECK-NEXT:    rts16
861entry:
862  %icmp = icmp ule i1 %y, %x
863  ret i1 %icmp
864}
865
866define i1 @ICMP_BIT_I_ule(i1 %x) {
867; CHECK-LABEL: ICMP_BIT_I_ule:
868; CHECK:       # %bb.0: # %entry
869; CHECK-NEXT:    movi16 a0, 1
870; CHECK-NEXT:    rts16
871entry:
872  %icmp = icmp ule i1 %x, 1
873  ret i1 %icmp
874}
875
876;sgt
877define i1 @icmpRR_sgt(i32 %x, i32 %y) {
878; CHECK-LABEL: icmpRR_sgt:
879; CHECK:       # %bb.0: # %entry
880; CHECK-NEXT:    cmplt16 a0, a1
881; CHECK-NEXT:    mvc32 a0
882; CHECK-NEXT:    rts16
883entry:
884  %icmp = icmp sgt i32 %y, %x
885  ret i1 %icmp
886}
887
888define i1 @icmpRI_sgt(i32 %x) {
889; CHECK-LABEL: icmpRI_sgt:
890; CHECK:       # %bb.0: # %entry
891; CHECK-NEXT:    movi16 a1, 10
892; CHECK-NEXT:    cmplt16 a1, a0
893; CHECK-NEXT:    mvc32 a0
894; CHECK-NEXT:    rts16
895entry:
896  %icmp = icmp sgt i32 %x, 10
897  ret i1 %icmp
898}
899
900define i1 @icmpRI_X_sgt(i32 %x) {
901; CHECK-LABEL: icmpRI_X_sgt:
902; CHECK:       # %bb.0: # %entry
903; CHECK-NEXT:    movih32 a1, 62
904; CHECK-NEXT:    ori32 a1, a1, 33768
905; CHECK-NEXT:    cmplt16 a1, a0
906; CHECK-NEXT:    mvc32 a0
907; CHECK-NEXT:    rts16
908entry:
909  %icmp = icmp sgt i32 %x, 4097000
910  ret i1 %icmp
911}
912
913define i1 @ICMP_LONG_sgt(i64 %x, i64 %y) {
914; CHECK-LABEL: ICMP_LONG_sgt:
915; CHECK:       # %bb.0: # %entry
916; CHECK-NEXT:    .cfi_def_cfa_offset 0
917; CHECK-NEXT:    subi16 sp, sp, 12
918; CHECK-NEXT:    .cfi_def_cfa_offset 12
919; CHECK-NEXT:    cmplt16 a1, a3
920; CHECK-NEXT:    mvc32 t0
921; CHECK-NEXT:    st32.w t0, (sp, 4)
922; CHECK-NEXT:    cmpne16 a3, a1
923; CHECK-NEXT:    mvc32 a1
924; CHECK-NEXT:    st16.w a1, (sp, 8)
925; CHECK-NEXT:    cmphs16 a0, a2
926; CHECK-NEXT:    mvcv16 a1
927; CHECK-NEXT:    ld16.w a0, (sp, 4)
928; CHECK-NEXT:    btsti32 a0, 0
929; CHECK-NEXT:    mvc32 a0
930; CHECK-NEXT:    ld16.w a2, (sp, 8)
931; CHECK-NEXT:    btsti32 a2, 0
932; CHECK-NEXT:    movf32 a0, a1
933; CHECK-NEXT:    addi16 sp, sp, 12
934; CHECK-NEXT:    rts16
935entry:
936  %icmp = icmp sgt i64 %y, %x
937  ret i1 %icmp
938}
939
940define i1 @ICMP_LONG_I_sgt(i64 %x) {
941; CHECK-LABEL: ICMP_LONG_I_sgt:
942; CHECK:       # %bb.0: # %entry
943; CHECK-NEXT:    .cfi_def_cfa_offset 0
944; CHECK-NEXT:    subi16 sp, sp, 12
945; CHECK-NEXT:    .cfi_def_cfa_offset 12
946; CHECK-NEXT:    movi16 a2, 0
947; CHECK-NEXT:    cmplt16 a2, a1
948; CHECK-NEXT:    mvc32 a2
949; CHECK-NEXT:    st16.w a2, (sp, 8)
950; CHECK-NEXT:    movi16 a2, 1
951; CHECK-NEXT:    cmphs16 a2, a0
952; CHECK-NEXT:    mvcv16 a2
953; CHECK-NEXT:    cmpnei16 a1, 0
954; CHECK-NEXT:    mvc32 a0
955; CHECK-NEXT:    st16.w a0, (sp, 4)
956; CHECK-NEXT:    ld16.w a0, (sp, 8)
957; CHECK-NEXT:    btsti32 a0, 0
958; CHECK-NEXT:    mvc32 a0
959; CHECK-NEXT:    ld16.w a1, (sp, 4)
960; CHECK-NEXT:    btsti32 a1, 0
961; CHECK-NEXT:    movf32 a0, a2
962; CHECK-NEXT:    addi16 sp, sp, 12
963; CHECK-NEXT:    rts16
964entry:
965  %icmp = icmp sgt i64 %x, 1
966  ret i1 %icmp
967}
968
969define i1 @ICMP_SHORT_sgt(i16 %x, i16 %y) {
970; CHECK-LABEL: ICMP_SHORT_sgt:
971; CHECK:       # %bb.0: # %entry
972; CHECK-NEXT:    sexth16 a1, a1
973; CHECK-NEXT:    sexth16 a0, a0
974; CHECK-NEXT:    cmplt16 a0, a1
975; CHECK-NEXT:    mvc32 a0
976; CHECK-NEXT:    rts16
977entry:
978  %icmp = icmp sgt i16 %y, %x
979  ret i1 %icmp
980}
981
982define i1 @ICMP_SHORT_I_sgt(i16 %x) {
983; CHECK-LABEL: ICMP_SHORT_I_sgt:
984; CHECK:       # %bb.0: # %entry
985; CHECK-NEXT:    sexth16 a0, a0
986; CHECK-NEXT:    movi16 a1, 1
987; CHECK-NEXT:    cmplt16 a1, a0
988; CHECK-NEXT:    mvc32 a0
989; CHECK-NEXT:    rts16
990entry:
991  %icmp = icmp sgt i16 %x, 1
992  ret i1 %icmp
993}
994
995define i1 @ICMP_CHAR_sgt(i8 %x, i8 %y) {
996; CHECK-LABEL: ICMP_CHAR_sgt:
997; CHECK:       # %bb.0: # %entry
998; CHECK-NEXT:    sextb16 a1, a1
999; CHECK-NEXT:    sextb16 a0, a0
1000; CHECK-NEXT:    cmplt16 a0, a1
1001; CHECK-NEXT:    mvc32 a0
1002; CHECK-NEXT:    rts16
1003entry:
1004  %icmp = icmp sgt i8 %y, %x
1005  ret i1 %icmp
1006}
1007
1008define i1 @ICMP_CHAR_I_sgt(i8 %x) {
1009; CHECK-LABEL: ICMP_CHAR_I_sgt:
1010; CHECK:       # %bb.0: # %entry
1011; CHECK-NEXT:    sextb16 a0, a0
1012; CHECK-NEXT:    movi16 a1, 1
1013; CHECK-NEXT:    cmplt16 a1, a0
1014; CHECK-NEXT:    mvc32 a0
1015; CHECK-NEXT:    rts16
1016entry:
1017  %icmp = icmp sgt i8 %x, 1
1018  ret i1 %icmp
1019}
1020
1021define i1 @ICMP_BIT_sgt(i1 %x, i1 %y) {
1022; CHECK-LABEL: ICMP_BIT_sgt:
1023; CHECK:       # %bb.0: # %entry
1024; CHECK-NEXT:    xori32 a1, a1, 1
1025; CHECK-NEXT:    and16 a0, a1
1026; CHECK-NEXT:    rts16
1027entry:
1028  %icmp = icmp sgt i1 %y, %x
1029  ret i1 %icmp
1030}
1031
1032define i1 @ICMP_BIT_I_sgt(i1 %x) {
1033; CHECK-LABEL: ICMP_BIT_I_sgt:
1034; CHECK:       # %bb.0: # %entry
1035; CHECK-NEXT:    xori32 a0, a0, 1
1036; CHECK-NEXT:    rts16
1037entry:
1038  %icmp = icmp sgt i1 %x, 1
1039  ret i1 %icmp
1040}
1041
1042;sge
1043define i1 @icmpRR_sge(i32 %x, i32 %y) {
1044; CHECK-LABEL: icmpRR_sge:
1045; CHECK:       # %bb.0: # %entry
1046; CHECK-NEXT:    cmplt16 a1, a0
1047; CHECK-NEXT:    mvcv16 a0
1048; CHECK-NEXT:    rts16
1049entry:
1050  %icmp = icmp sge i32 %y, %x
1051  ret i1 %icmp
1052}
1053
1054define i1 @icmpRI_sge(i32 %x) {
1055; CHECK-LABEL: icmpRI_sge:
1056; CHECK:       # %bb.0: # %entry
1057; CHECK-NEXT:    movi16 a1, 9
1058; CHECK-NEXT:    cmplt16 a1, a0
1059; CHECK-NEXT:    mvc32 a0
1060; CHECK-NEXT:    rts16
1061entry:
1062  %icmp = icmp sge i32 %x, 10
1063  ret i1 %icmp
1064}
1065
1066define i1 @icmpRI_X_sge(i32 %x) {
1067; CHECK-LABEL: icmpRI_X_sge:
1068; CHECK:       # %bb.0: # %entry
1069; CHECK-NEXT:    movih32 a1, 62
1070; CHECK-NEXT:    ori32 a1, a1, 33767
1071; CHECK-NEXT:    cmplt16 a1, a0
1072; CHECK-NEXT:    mvc32 a0
1073; CHECK-NEXT:    rts16
1074entry:
1075  %icmp = icmp sge i32 %x, 4097000
1076  ret i1 %icmp
1077}
1078
1079define i1 @ICMP_LONG_sge(i64 %x, i64 %y) {
1080; CHECK-LABEL: ICMP_LONG_sge:
1081; CHECK:       # %bb.0: # %entry
1082; CHECK-NEXT:    .cfi_def_cfa_offset 0
1083; CHECK-NEXT:    subi16 sp, sp, 12
1084; CHECK-NEXT:    .cfi_def_cfa_offset 12
1085; CHECK-NEXT:    cmphs16 a2, a0
1086; CHECK-NEXT:    mvc32 a0
1087; CHECK-NEXT:    st16.w a0, (sp, 4)
1088; CHECK-NEXT:    cmpne16 a3, a1
1089; CHECK-NEXT:    mvc32 a0
1090; CHECK-NEXT:    st16.w a0, (sp, 8)
1091; CHECK-NEXT:    cmplt16 a3, a1
1092; CHECK-NEXT:    mvcv16 a0
1093; CHECK-NEXT:    ld16.w a1, (sp, 4)
1094; CHECK-NEXT:    btsti32 a1, 0
1095; CHECK-NEXT:    mvc32 a1
1096; CHECK-NEXT:    ld16.w a2, (sp, 8)
1097; CHECK-NEXT:    btsti32 a2, 0
1098; CHECK-NEXT:    movf32 a0, a1
1099; CHECK-NEXT:    addi16 sp, sp, 12
1100; CHECK-NEXT:    rts16
1101entry:
1102  %icmp = icmp sge i64 %y, %x
1103  ret i1 %icmp
1104}
1105
1106define i1 @ICMP_LONG_I_sge(i64 %x) {
1107; CHECK-LABEL: ICMP_LONG_I_sge:
1108; CHECK:       # %bb.0: # %entry
1109; CHECK-NEXT:    .cfi_def_cfa_offset 0
1110; CHECK-NEXT:    subi16 sp, sp, 16
1111; CHECK-NEXT:    .cfi_def_cfa_offset 16
1112; CHECK-NEXT:    movi16 a2, 0
1113; CHECK-NEXT:    cmplt16 a2, a1
1114; CHECK-NEXT:    mvc32 a2
1115; CHECK-NEXT:    st16.w a2, (sp, 12)
1116; CHECK-NEXT:    cmpnei16 a0, 0
1117; CHECK-NEXT:    mvc32 a0
1118; CHECK-NEXT:    st16.w a0, (sp, 4)
1119; CHECK-NEXT:    cmpnei16 a1, 0
1120; CHECK-NEXT:    mvc32 a0
1121; CHECK-NEXT:    st16.w a0, (sp, 8)
1122; CHECK-NEXT:    ld16.w a0, (sp, 4)
1123; CHECK-NEXT:    btsti32 a0, 0
1124; CHECK-NEXT:    mvc32 a1
1125; CHECK-NEXT:    ld16.w a0, (sp, 12)
1126; CHECK-NEXT:    btsti32 a0, 0
1127; CHECK-NEXT:    mvc32 a0
1128; CHECK-NEXT:    ld16.w a2, (sp, 8)
1129; CHECK-NEXT:    btsti32 a2, 0
1130; CHECK-NEXT:    movf32 a0, a1
1131; CHECK-NEXT:    addi16 sp, sp, 16
1132; CHECK-NEXT:    rts16
1133entry:
1134  %icmp = icmp sge i64 %x, 1
1135  ret i1 %icmp
1136}
1137
1138define i1 @ICMP_SHORT_sge(i16 %x, i16 %y) {
1139; CHECK-LABEL: ICMP_SHORT_sge:
1140; CHECK:       # %bb.0: # %entry
1141; CHECK-NEXT:    sexth16 a0, a0
1142; CHECK-NEXT:    sexth16 a1, a1
1143; CHECK-NEXT:    cmplt16 a1, a0
1144; CHECK-NEXT:    mvcv16 a0
1145; CHECK-NEXT:    rts16
1146entry:
1147  %icmp = icmp sge i16 %y, %x
1148  ret i1 %icmp
1149}
1150
1151define i1 @ICMP_SHORT_I_sge(i16 %x) {
1152; CHECK-LABEL: ICMP_SHORT_I_sge:
1153; CHECK:       # %bb.0: # %entry
1154; CHECK-NEXT:    sexth16 a0, a0
1155; CHECK-NEXT:    movi16 a1, 0
1156; CHECK-NEXT:    cmplt16 a1, a0
1157; CHECK-NEXT:    mvc32 a0
1158; CHECK-NEXT:    rts16
1159entry:
1160  %icmp = icmp sge i16 %x, 1
1161  ret i1 %icmp
1162}
1163
1164define i1 @ICMP_CHAR_sge(i8 %x, i8 %y) {
1165; CHECK-LABEL: ICMP_CHAR_sge:
1166; CHECK:       # %bb.0: # %entry
1167; CHECK-NEXT:    sextb16 a0, a0
1168; CHECK-NEXT:    sextb16 a1, a1
1169; CHECK-NEXT:    cmplt16 a1, a0
1170; CHECK-NEXT:    mvcv16 a0
1171; CHECK-NEXT:    rts16
1172entry:
1173  %icmp = icmp sge i8 %y, %x
1174  ret i1 %icmp
1175}
1176
1177define i1 @ICMP_CHAR_I_sge(i8 %x) {
1178; CHECK-LABEL: ICMP_CHAR_I_sge:
1179; CHECK:       # %bb.0: # %entry
1180; CHECK-NEXT:    sextb16 a0, a0
1181; CHECK-NEXT:    movi16 a1, 0
1182; CHECK-NEXT:    cmplt16 a1, a0
1183; CHECK-NEXT:    mvc32 a0
1184; CHECK-NEXT:    rts16
1185entry:
1186  %icmp = icmp sge i8 %x, 1
1187  ret i1 %icmp
1188}
1189
1190define i1 @ICMP_BIT_sge(i1 %x, i1 %y) {
1191; CHECK-LABEL: ICMP_BIT_sge:
1192; CHECK:       # %bb.0: # %entry
1193; CHECK-NEXT:    xori32 a1, a1, 1
1194; CHECK-NEXT:    or16 a0, a1
1195; CHECK-NEXT:    rts16
1196entry:
1197  %icmp = icmp sge i1 %y, %x
1198  ret i1 %icmp
1199}
1200
1201define i1 @ICMP_BIT_I_sge(i1 %x) {
1202; CHECK-LABEL: ICMP_BIT_I_sge:
1203; CHECK:       # %bb.0: # %entry
1204; CHECK-NEXT:    movi16 a0, 1
1205; CHECK-NEXT:    rts16
1206entry:
1207  %icmp = icmp sge i1 %x, 1
1208  ret i1 %icmp
1209}
1210
1211;slt
1212define i1 @icmpRR_slt(i32 %x, i32 %y) {
1213; CHECK-LABEL: icmpRR_slt:
1214; CHECK:       # %bb.0: # %entry
1215; CHECK-NEXT:    cmplt16 a1, a0
1216; CHECK-NEXT:    mvc32 a0
1217; CHECK-NEXT:    rts16
1218entry:
1219  %icmp = icmp slt i32 %y, %x
1220  ret i1 %icmp
1221}
1222
1223define i1 @icmpRI_slt(i32 %x) {
1224; CHECK-LABEL: icmpRI_slt:
1225; CHECK:       # %bb.0: # %entry
1226; CHECK-NEXT:    cmplti16 a0, 10
1227; CHECK-NEXT:    mvc32 a0
1228; CHECK-NEXT:    rts16
1229entry:
1230  %icmp = icmp slt i32 %x, 10
1231  ret i1 %icmp
1232}
1233
1234define i1 @icmpRI_X_slt(i32 %x) {
1235; CHECK-LABEL: icmpRI_X_slt:
1236; CHECK:       # %bb.0: # %entry
1237; CHECK-NEXT:    movih32 a1, 62
1238; CHECK-NEXT:    ori32 a1, a1, 33768
1239; CHECK-NEXT:    cmplt16 a0, a1
1240; CHECK-NEXT:    mvc32 a0
1241; CHECK-NEXT:    rts16
1242entry:
1243  %icmp = icmp slt i32 %x, 4097000
1244  ret i1 %icmp
1245}
1246
1247define i1 @ICMP_LONG_slt(i64 %x, i64 %y) {
1248; CHECK-LABEL: ICMP_LONG_slt:
1249; CHECK:       # %bb.0: # %entry
1250; CHECK-NEXT:    .cfi_def_cfa_offset 0
1251; CHECK-NEXT:    subi16 sp, sp, 12
1252; CHECK-NEXT:    .cfi_def_cfa_offset 12
1253; CHECK-NEXT:    cmplt16 a3, a1
1254; CHECK-NEXT:    mvc32 t0
1255; CHECK-NEXT:    st32.w t0, (sp, 4)
1256; CHECK-NEXT:    cmpne16 a3, a1
1257; CHECK-NEXT:    mvc32 a1
1258; CHECK-NEXT:    st16.w a1, (sp, 8)
1259; CHECK-NEXT:    cmphs16 a2, a0
1260; CHECK-NEXT:    mvcv16 a1
1261; CHECK-NEXT:    ld16.w a0, (sp, 4)
1262; CHECK-NEXT:    btsti32 a0, 0
1263; CHECK-NEXT:    mvc32 a0
1264; CHECK-NEXT:    ld16.w a2, (sp, 8)
1265; CHECK-NEXT:    btsti32 a2, 0
1266; CHECK-NEXT:    movf32 a0, a1
1267; CHECK-NEXT:    addi16 sp, sp, 12
1268; CHECK-NEXT:    rts16
1269entry:
1270  %icmp = icmp slt i64 %y, %x
1271  ret i1 %icmp
1272}
1273
1274define i1 @ICMP_LONG_I_slt(i64 %x) {
1275; CHECK-LABEL: ICMP_LONG_I_slt:
1276; CHECK:       # %bb.0: # %entry
1277; CHECK-NEXT:    .cfi_def_cfa_offset 0
1278; CHECK-NEXT:    subi16 sp, sp, 12
1279; CHECK-NEXT:    .cfi_def_cfa_offset 12
1280; CHECK-NEXT:    movi16 a2, 0
1281; CHECK-NEXT:    cmplt16 a1, a2
1282; CHECK-NEXT:    mvc32 a2
1283; CHECK-NEXT:    st16.w a2, (sp, 4)
1284; CHECK-NEXT:    cmpnei16 a1, 0
1285; CHECK-NEXT:    mvc32 a1
1286; CHECK-NEXT:    st16.w a1, (sp, 8)
1287; CHECK-NEXT:    cmpnei16 a0, 0
1288; CHECK-NEXT:    mvcv16 a1
1289; CHECK-NEXT:    ld16.w a0, (sp, 4)
1290; CHECK-NEXT:    btsti32 a0, 0
1291; CHECK-NEXT:    mvc32 a0
1292; CHECK-NEXT:    ld16.w a2, (sp, 8)
1293; CHECK-NEXT:    btsti32 a2, 0
1294; CHECK-NEXT:    movf32 a0, a1
1295; CHECK-NEXT:    addi16 sp, sp, 12
1296; CHECK-NEXT:    rts16
1297entry:
1298  %icmp = icmp slt i64 %x, 1
1299  ret i1 %icmp
1300}
1301
1302define i1 @ICMP_SHORT_slt(i16 %x, i16 %y) {
1303; CHECK-LABEL: ICMP_SHORT_slt:
1304; CHECK:       # %bb.0: # %entry
1305; CHECK-NEXT:    sexth16 a0, a0
1306; CHECK-NEXT:    sexth16 a1, a1
1307; CHECK-NEXT:    cmplt16 a1, a0
1308; CHECK-NEXT:    mvc32 a0
1309; CHECK-NEXT:    rts16
1310entry:
1311  %icmp = icmp slt i16 %y, %x
1312  ret i1 %icmp
1313}
1314
1315define i1 @ICMP_SHORT_I_slt(i16 %x) {
1316; CHECK-LABEL: ICMP_SHORT_I_slt:
1317; CHECK:       # %bb.0: # %entry
1318; CHECK-NEXT:    sexth16 a0, a0
1319; CHECK-NEXT:    cmplti16 a0, 1
1320; CHECK-NEXT:    mvc32 a0
1321; CHECK-NEXT:    rts16
1322entry:
1323  %icmp = icmp slt i16 %x, 1
1324  ret i1 %icmp
1325}
1326
1327define i1 @ICMP_CHAR_slt(i8 %x, i8 %y) {
1328; CHECK-LABEL: ICMP_CHAR_slt:
1329; CHECK:       # %bb.0: # %entry
1330; CHECK-NEXT:    sextb16 a0, a0
1331; CHECK-NEXT:    sextb16 a1, a1
1332; CHECK-NEXT:    cmplt16 a1, a0
1333; CHECK-NEXT:    mvc32 a0
1334; CHECK-NEXT:    rts16
1335entry:
1336  %icmp = icmp slt i8 %y, %x
1337  ret i1 %icmp
1338}
1339
1340define i1 @ICMP_CHAR_I_slt(i8 %x) {
1341; CHECK-LABEL: ICMP_CHAR_I_slt:
1342; CHECK:       # %bb.0: # %entry
1343; CHECK-NEXT:    sextb16 a0, a0
1344; CHECK-NEXT:    cmplti16 a0, 1
1345; CHECK-NEXT:    mvc32 a0
1346; CHECK-NEXT:    rts16
1347entry:
1348  %icmp = icmp slt i8 %x, 1
1349  ret i1 %icmp
1350}
1351
1352define i1 @ICMP_BIT_slt(i1 %x, i1 %y) {
1353; CHECK-LABEL: ICMP_BIT_slt:
1354; CHECK:       # %bb.0: # %entry
1355; CHECK-NEXT:    xori32 a0, a0, 1
1356; CHECK-NEXT:    and16 a0, a1
1357; CHECK-NEXT:    rts16
1358entry:
1359  %icmp = icmp slt i1 %y, %x
1360  ret i1 %icmp
1361}
1362
1363define i1 @ICMP_BIT_I_slt(i1 %x) {
1364; CHECK-LABEL: ICMP_BIT_I_slt:
1365; CHECK:       # %bb.0: # %entry
1366; CHECK-NEXT:    movi16 a0, 0
1367; CHECK-NEXT:    rts16
1368entry:
1369  %icmp = icmp slt i1 %x, 1
1370  ret i1 %icmp
1371}
1372
1373
1374;sle
1375define i1 @icmpRR_sle(i32 %x, i32 %y) {
1376; CHECK-LABEL: icmpRR_sle:
1377; CHECK:       # %bb.0: # %entry
1378; CHECK-NEXT:    cmplt16 a0, a1
1379; CHECK-NEXT:    mvcv16 a0
1380; CHECK-NEXT:    rts16
1381entry:
1382  %icmp = icmp sle i32 %y, %x
1383  ret i1 %icmp
1384}
1385
1386define i1 @icmpRI_sle(i32 %x) {
1387; CHECK-LABEL: icmpRI_sle:
1388; CHECK:       # %bb.0: # %entry
1389; CHECK-NEXT:    cmplti16 a0, 11
1390; CHECK-NEXT:    mvc32 a0
1391; CHECK-NEXT:    rts16
1392entry:
1393  %icmp = icmp sle i32 %x, 10
1394  ret i1 %icmp
1395}
1396
1397define i1 @icmpRI_X_sle(i32 %x) {
1398; CHECK-LABEL: icmpRI_X_sle:
1399; CHECK:       # %bb.0: # %entry
1400; CHECK-NEXT:    movih32 a1, 62
1401; CHECK-NEXT:    ori32 a1, a1, 33769
1402; CHECK-NEXT:    cmplt16 a0, a1
1403; CHECK-NEXT:    mvc32 a0
1404; CHECK-NEXT:    rts16
1405entry:
1406  %icmp = icmp sle i32 %x, 4097000
1407  ret i1 %icmp
1408}
1409
1410define i1 @ICMP_LONG_sle(i64 %x, i64 %y) {
1411; CHECK-LABEL: ICMP_LONG_sle:
1412; CHECK:       # %bb.0: # %entry
1413; CHECK-NEXT:    .cfi_def_cfa_offset 0
1414; CHECK-NEXT:    subi16 sp, sp, 12
1415; CHECK-NEXT:    .cfi_def_cfa_offset 12
1416; CHECK-NEXT:    cmphs16 a0, a2
1417; CHECK-NEXT:    mvc32 a0
1418; CHECK-NEXT:    st16.w a0, (sp, 4)
1419; CHECK-NEXT:    cmpne16 a3, a1
1420; CHECK-NEXT:    mvc32 a0
1421; CHECK-NEXT:    st16.w a0, (sp, 8)
1422; CHECK-NEXT:    cmplt16 a1, a3
1423; CHECK-NEXT:    mvcv16 a0
1424; CHECK-NEXT:    ld16.w a1, (sp, 4)
1425; CHECK-NEXT:    btsti32 a1, 0
1426; CHECK-NEXT:    mvc32 a1
1427; CHECK-NEXT:    ld16.w a2, (sp, 8)
1428; CHECK-NEXT:    btsti32 a2, 0
1429; CHECK-NEXT:    movf32 a0, a1
1430; CHECK-NEXT:    addi16 sp, sp, 12
1431; CHECK-NEXT:    rts16
1432entry:
1433  %icmp = icmp sle i64 %y, %x
1434  ret i1 %icmp
1435}
1436
1437define i1 @ICMP_LONG_I_sle(i64 %x) {
1438; CHECK-LABEL: ICMP_LONG_I_sle:
1439; CHECK:       # %bb.0: # %entry
1440; CHECK-NEXT:    .cfi_def_cfa_offset 0
1441; CHECK-NEXT:    subi16 sp, sp, 12
1442; CHECK-NEXT:    .cfi_def_cfa_offset 12
1443; CHECK-NEXT:    movi16 a2, 0
1444; CHECK-NEXT:    cmplt16 a1, a2
1445; CHECK-NEXT:    mvc32 a2
1446; CHECK-NEXT:    st16.w a2, (sp, 4)
1447; CHECK-NEXT:    cmpnei16 a1, 0
1448; CHECK-NEXT:    mvc32 a1
1449; CHECK-NEXT:    st16.w a1, (sp, 8)
1450; CHECK-NEXT:    cmphsi16 a0, 2
1451; CHECK-NEXT:    mvcv16 a1
1452; CHECK-NEXT:    ld16.w a0, (sp, 4)
1453; CHECK-NEXT:    btsti32 a0, 0
1454; CHECK-NEXT:    mvc32 a0
1455; CHECK-NEXT:    ld16.w a2, (sp, 8)
1456; CHECK-NEXT:    btsti32 a2, 0
1457; CHECK-NEXT:    movf32 a0, a1
1458; CHECK-NEXT:    addi16 sp, sp, 12
1459; CHECK-NEXT:    rts16
1460entry:
1461  %icmp = icmp sle i64 %x, 1
1462  ret i1 %icmp
1463}
1464
1465define i1 @ICMP_SHORT_sle(i16 %x, i16 %y) {
1466; CHECK-LABEL: ICMP_SHORT_sle:
1467; CHECK:       # %bb.0: # %entry
1468; CHECK-NEXT:    sexth16 a1, a1
1469; CHECK-NEXT:    sexth16 a0, a0
1470; CHECK-NEXT:    cmplt16 a0, a1
1471; CHECK-NEXT:    mvcv16 a0
1472; CHECK-NEXT:    rts16
1473entry:
1474  %icmp = icmp sle i16 %y, %x
1475  ret i1 %icmp
1476}
1477
1478define i1 @ICMP_SHORT_I_sle(i16 %x) {
1479; CHECK-LABEL: ICMP_SHORT_I_sle:
1480; CHECK:       # %bb.0: # %entry
1481; CHECK-NEXT:    sexth16 a0, a0
1482; CHECK-NEXT:    cmplti16 a0, 2
1483; CHECK-NEXT:    mvc32 a0
1484; CHECK-NEXT:    rts16
1485entry:
1486  %icmp = icmp sle i16 %x, 1
1487  ret i1 %icmp
1488}
1489
1490define i1 @ICMP_CHAR_sle(i8 %x, i8 %y) {
1491; CHECK-LABEL: ICMP_CHAR_sle:
1492; CHECK:       # %bb.0: # %entry
1493; CHECK-NEXT:    sextb16 a1, a1
1494; CHECK-NEXT:    sextb16 a0, a0
1495; CHECK-NEXT:    cmplt16 a0, a1
1496; CHECK-NEXT:    mvcv16 a0
1497; CHECK-NEXT:    rts16
1498entry:
1499  %icmp = icmp sle i8 %y, %x
1500  ret i1 %icmp
1501}
1502
1503define i1 @ICMP_CHAR_I_sle(i8 %x) {
1504; CHECK-LABEL: ICMP_CHAR_I_sle:
1505; CHECK:       # %bb.0: # %entry
1506; CHECK-NEXT:    sextb16 a0, a0
1507; CHECK-NEXT:    cmplti16 a0, 2
1508; CHECK-NEXT:    mvc32 a0
1509; CHECK-NEXT:    rts16
1510entry:
1511  %icmp = icmp sle i8 %x, 1
1512  ret i1 %icmp
1513}
1514
1515define i1 @ICMP_BIT_sle(i1 %x, i1 %y) {
1516; CHECK-LABEL: ICMP_BIT_sle:
1517; CHECK:       # %bb.0: # %entry
1518; CHECK-NEXT:    xori32 a0, a0, 1
1519; CHECK-NEXT:    or16 a0, a1
1520; CHECK-NEXT:    rts16
1521entry:
1522  %icmp = icmp sle i1 %y, %x
1523  ret i1 %icmp
1524}
1525
1526define i1 @ICMP_BIT_I_sle(i1 %x) {
1527; CHECK-LABEL: ICMP_BIT_I_sle:
1528; CHECK:       # %bb.0: # %entry
1529; CHECK-NEXT:    rts16
1530entry:
1531  %icmp = icmp sle i1 %x, 1
1532  ret i1 %icmp
1533}
1534