• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -mtriple=i686-linux-gnu %s -o - | FileCheck %s
2
3
4define i32 @branch_eq(i64 %a, i64 %b) {
5entry:
6  %cmp = icmp eq i64 %a, %b
7	br i1 %cmp, label %bb1, label %bb2
8bb1:
9  ret i32 1
10bb2:
11  ret i32 2
12
13; CHECK-LABEL: branch_eq:
14; CHECK: movl 4(%esp), [[LHSLo:%[a-z]+]]
15; CHECK: movl 8(%esp), [[LHSHi:%[a-z]+]]
16; CHECK: xorl 16(%esp), [[LHSHi]]
17; CHECK: xorl 12(%esp), [[LHSLo]]
18; CHECK: orl [[LHSHi]], [[LHSLo]]
19; CHECK: jne [[FALSE:.LBB[0-9_]+]]
20; CHECK: movl $1, %eax
21; CHECK: retl
22; CHECK: [[FALSE]]:
23; CHECK: movl $2, %eax
24; CHECK: retl
25}
26
27define i32 @branch_slt(i64 %a, i64 %b) {
28entry:
29  %cmp = icmp slt i64 %a, %b
30	br i1 %cmp, label %bb1, label %bb2
31bb1:
32  ret i32 1
33bb2:
34  ret i32 2
35
36; CHECK-LABEL: branch_slt:
37; CHECK: movl 4(%esp), [[LHSLo:%[a-z]+]]
38; CHECK: movl 8(%esp), [[LHSHi:%[a-z]+]]
39; CHECK: cmpl 12(%esp), [[LHSLo]]
40; CHECK: sbbl 16(%esp), [[LHSHi]]
41; CHECK: jge [[FALSE:.LBB[0-9_]+]]
42; CHECK: movl $1, %eax
43; CHECK: retl
44; CHECK: [[FALSE]]:
45; CHECK: movl $2, %eax
46; CHECK: retl
47}
48
49define i32 @branch_ule(i64 %a, i64 %b) {
50entry:
51  %cmp = icmp ule i64 %a, %b
52	br i1 %cmp, label %bb1, label %bb2
53bb1:
54  ret i32 1
55bb2:
56  ret i32 2
57
58; CHECK-LABEL: branch_ule:
59; CHECK: movl 12(%esp), [[RHSLo:%[a-z]+]]
60; CHECK: movl 16(%esp), [[RHSHi:%[a-z]+]]
61; CHECK: cmpl 4(%esp), [[RHSLo]]
62; CHECK: sbbl 8(%esp), [[RHSHi]]
63; CHECK: jb [[FALSE:.LBB[0-9_]+]]
64; CHECK: movl $1, %eax
65; CHECK: retl
66; CHECK: [[FALSE]]:
67; CHECK: movl $2, %eax
68; CHECK: retl
69}
70
71define i32 @set_gt(i64 %a, i64 %b) {
72entry:
73  %cmp = icmp sgt i64 %a, %b
74  %res = select i1 %cmp, i32 1, i32 0
75  ret i32 %res
76
77; CHECK-LABEL: set_gt:
78; CHECK: movl 12(%esp), [[RHSLo:%[a-z]+]]
79; CHECK: movl 16(%esp), [[RHSHi:%[a-z]+]]
80; CHECK: cmpl 4(%esp), [[RHSLo]]
81; CHECK: sbbl 8(%esp), [[RHSHi]]
82; CHECK: setl %al
83; CHECK: retl
84}
85
86define i32 @test_wide(i128 %a, i128 %b) {
87entry:
88  %cmp = icmp slt i128 %a, %b
89	br i1 %cmp, label %bb1, label %bb2
90bb1:
91  ret i32 1
92bb2:
93  ret i32 2
94
95; CHECK-LABEL: test_wide:
96; CHECK: cmpl 24(%esp)
97; CHECK: sbbl 28(%esp)
98; CHECK: sbbl 32(%esp)
99; CHECK: sbbl 36(%esp)
100; CHECK: jge [[FALSE:.LBB[0-9_]+]]
101; CHECK: movl $1, %eax
102; CHECK: retl
103; CHECK: [[FALSE]]:
104; CHECK: movl $2, %eax
105; CHECK: retl
106}
107
108define i32 @test_carry_false(i64 %a, i64 %b) {
109entry:
110  %x = and i64 %a, -4294967296 ;0xffffffff00000000
111  %y = and i64 %b, -4294967296
112  %cmp = icmp slt i64 %x, %y
113	br i1 %cmp, label %bb1, label %bb2
114bb1:
115  ret i32 1
116bb2:
117  ret i32 2
118
119; The comparison of the low bits will be folded to a CARRY_FALSE node. Make
120; sure the code can handle that.
121; CHECK-LABEL: carry_false:
122; CHECK: movl 8(%esp), [[LHSHi:%[a-z]+]]
123; CHECK: cmpl 16(%esp), [[LHSHi]]
124; CHECK: jge [[FALSE:.LBB[0-9_]+]]
125; CHECK: movl $1, %eax
126; CHECK: retl
127; CHECK: [[FALSE]]:
128; CHECK: movl $2, %eax
129; CHECK: retl
130}
131