1 ; RUN: llc -march=mipsel -relocation-model=pic -O0 -fast-isel-abort=3 -mcpu=mips32r2 \
2 ; RUN: < %s | FileCheck %s
3 ; RUN: llc -march=mipsel -relocation-model=pic -O0 -fast-isel-abort=3 -mcpu=mips32 \
4 ; RUN: < %s | FileCheck %s
6 @c = global i32 4, align 4
7 @d = global i32 9, align 4
8 @uc = global i32 4, align 4
9 @ud = global i32 9, align 4
10 @b1 = common global i32 0, align 4
12 ; Function Attrs: nounwind
15 ; CHECK-LABEL: .ent eq
17 %0 = load i32, i32* @c, align 4
18 %1 = load i32, i32* @d, align 4
19 %cmp = icmp eq i32 %0, %1
20 %conv = zext i1 %cmp to i32
21 ; CHECK-DAG: lw $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
22 ; CHECK-DAG: lw $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
23 ; CHECK-DAG: lw $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
24 ; CHECK-DAG: lw $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
25 ; CHECK: xor $[[REG1:[0-9]+]], $[[REG_C]], $[[REG_D]]
26 ; CHECK: sltiu $[[REG2:[0-9]+]], $[[REG1]], 1
27 ; FIXME: This instruction is redundant. The sltiu can only produce 0 and 1.
28 ; CHECK: andi ${{[0-9]+}}, $[[REG2]], 1
30 store i32 %conv, i32* @b1, align 4
34 ; Function Attrs: nounwind
37 ; CHECK-LABEL: .ent ne
38 %0 = load i32, i32* @c, align 4
39 %1 = load i32, i32* @d, align 4
40 %cmp = icmp ne i32 %0, %1
41 %conv = zext i1 %cmp to i32
42 ; CHECK-DAG: lw $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
43 ; CHECK-DAG: lw $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
44 ; CHECK-DAG: lw $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
45 ; CHECK-DAG: lw $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
46 ; CHECK: xor $[[REG1:[0-9]+]], $[[REG_C]], $[[REG_D]]
47 ; CHECK: sltu $[[REG2:[0-9]+]], $zero, $[[REG1]]
48 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
49 ; CHECK: andi ${{[0-9]+}}, $[[REG2]], 1
51 store i32 %conv, i32* @b1, align 4
55 ; Function Attrs: nounwind
58 ; CHECK-LABEL: .ent ugt
59 %0 = load i32, i32* @uc, align 4
60 %1 = load i32, i32* @ud, align 4
61 %cmp = icmp ugt i32 %0, %1
62 %conv = zext i1 %cmp to i32
63 ; CHECK-DAG: lw $[[REG_UD_GOT:[0-9+]]], %got(ud)(${{[0-9]+}})
64 ; CHECK-DAG: lw $[[REG_UC_GOT:[0-9+]]], %got(uc)(${{[0-9]+}})
65 ; CHECK-DAG: lw $[[REG_UD:[0-9]+]], 0($[[REG_UD_GOT]])
66 ; CHECK-DAG: lw $[[REG_UC:[0-9]+]], 0($[[REG_UC_GOT]])
67 ; CHECK: sltu $[[REG1:[0-9]+]], $[[REG_UD]], $[[REG_UC]]
68 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
69 ; CHECK: andi ${{[0-9]+}}, $[[REG1]], 1
71 store i32 %conv, i32* @b1, align 4
75 ; Function Attrs: nounwind
78 ; CHECK-LABEL: .ent ult
79 %0 = load i32, i32* @uc, align 4
80 %1 = load i32, i32* @ud, align 4
81 %cmp = icmp ult i32 %0, %1
82 %conv = zext i1 %cmp to i32
83 ; CHECK-DAG: lw $[[REG_UD_GOT:[0-9+]]], %got(ud)(${{[0-9]+}})
84 ; CHECK-DAG: lw $[[REG_UC_GOT:[0-9+]]], %got(uc)(${{[0-9]+}})
85 ; CHECK-DAG: lw $[[REG_UD:[0-9]+]], 0($[[REG_UD_GOT]])
86 ; CHECK-DAG: lw $[[REG_UC:[0-9]+]], 0($[[REG_UC_GOT]])
87 ; CHECK: sltu $[[REG1:[0-9]+]], $[[REG_UC]], $[[REG_UD]]
88 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
89 ; CHECK: andi ${{[0-9]+}}, $[[REG1]], 1
90 store i32 %conv, i32* @b1, align 4
94 ; Function Attrs: nounwind
97 ; CHECK-LABEL: .ent uge
98 %0 = load i32, i32* @uc, align 4
99 %1 = load i32, i32* @ud, align 4
100 %cmp = icmp uge i32 %0, %1
101 %conv = zext i1 %cmp to i32
102 ; CHECK-DAG: lw $[[REG_UD_GOT:[0-9+]]], %got(ud)(${{[0-9]+}})
103 ; CHECK-DAG: lw $[[REG_UC_GOT:[0-9+]]], %got(uc)(${{[0-9]+}})
104 ; CHECK-DAG: lw $[[REG_UD:[0-9]+]], 0($[[REG_UD_GOT]])
105 ; CHECK-DAG: lw $[[REG_UC:[0-9]+]], 0($[[REG_UC_GOT]])
106 ; CHECK: sltu $[[REG1:[0-9]+]], $[[REG_UC]], $[[REG_UD]]
107 ; CHECK: xori $[[REG2:[0-9]+]], $[[REG1]], 1
108 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
109 ; CHECK: andi ${{[0-9]+}}, $[[REG2]], 1
110 store i32 %conv, i32* @b1, align 4
114 ; Function Attrs: nounwind
117 ; CHECK-LABEL: .ent ule
118 %0 = load i32, i32* @uc, align 4
119 %1 = load i32, i32* @ud, align 4
120 %cmp = icmp ule i32 %0, %1
121 %conv = zext i1 %cmp to i32
122 ; CHECK-DAG: lw $[[REG_UD_GOT:[0-9+]]], %got(ud)(${{[0-9]+}})
123 ; CHECK-DAG: lw $[[REG_UC_GOT:[0-9+]]], %got(uc)(${{[0-9]+}})
124 ; CHECK-DAG: lw $[[REG_UD:[0-9]+]], 0($[[REG_UD_GOT]])
125 ; CHECK-DAG: lw $[[REG_UC:[0-9]+]], 0($[[REG_UC_GOT]])
126 ; CHECK: sltu $[[REG1:[0-9]+]], $[[REG_UD]], $[[REG_UC]]
127 ; CHECK: xori $[[REG2:[0-9]+]], $[[REG1]], 1
128 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
129 ; CHECK: andi ${{[0-9]+}}, $[[REG2]], 1
130 store i32 %conv, i32* @b1, align 4
134 ; Function Attrs: nounwind
137 ; CHECK-LABEL: .ent sgt
138 %0 = load i32, i32* @c, align 4
139 %1 = load i32, i32* @d, align 4
140 %cmp = icmp sgt i32 %0, %1
141 %conv = zext i1 %cmp to i32
142 ; CHECK-DAG: lw $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
143 ; CHECK-DAG: lw $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
144 ; CHECK-DAG: lw $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
145 ; CHECK-DAG: lw $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
146 ; CHECK: slt $[[REG1:[0-9]+]], $[[REG_D]], $[[REG_C]]
147 ; FIXME: This instruction is redundant. The slt can only produce 0 and 1.
148 ; CHECK: andi ${{[0-9]+}}, $[[REG1]], 1
149 store i32 %conv, i32* @b1, align 4
153 ; Function Attrs: nounwind
156 ; CHECK-LABEL: .ent slt
157 %0 = load i32, i32* @c, align 4
158 %1 = load i32, i32* @d, align 4
159 %cmp = icmp slt i32 %0, %1
160 %conv = zext i1 %cmp to i32
161 ; CHECK-DAG: lw $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
162 ; CHECK-DAG: lw $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
163 ; CHECK-DAG: lw $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
164 ; CHECK-DAG: lw $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
165 ; CHECK: slt $[[REG1:[0-9]+]], $[[REG_C]], $[[REG_D]]
166 ; FIXME: This instruction is redundant. The slt can only produce 0 and 1.
167 ; CHECK: andi ${{[0-9]+}}, $[[REG1]], 1
168 store i32 %conv, i32* @b1, align 4
172 ; Function Attrs: nounwind
175 ; CHECK-LABEL: .ent sge
176 %0 = load i32, i32* @c, align 4
177 %1 = load i32, i32* @d, align 4
178 %cmp = icmp sge i32 %0, %1
179 %conv = zext i1 %cmp to i32
180 store i32 %conv, i32* @b1, align 4
181 ; CHECK-DAG: lw $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
182 ; CHECK-DAG: lw $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
183 ; CHECK-DAG: lw $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
184 ; CHECK-DAG: lw $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
185 ; CHECK: slt $[[REG1:[0-9]+]], $[[REG_C]], $[[REG_D]]
186 ; CHECK: xori $[[REG2:[0-9]+]], $[[REG1]], 1
187 ; FIXME: This instruction is redundant. The slt can only produce 0 and 1.
188 ; CHECK: andi ${{[0-9]+}}, $[[REG2]], 1
192 ; Function Attrs: nounwind
195 ; CHECK-LABEL: .ent sle
196 %0 = load i32, i32* @c, align 4
197 %1 = load i32, i32* @d, align 4
198 %cmp = icmp sle i32 %0, %1
199 %conv = zext i1 %cmp to i32
200 ; CHECK-DAG: lw $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
201 ; CHECK-DAG: lw $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
202 ; CHECK-DAG: lw $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
203 ; CHECK-DAG: lw $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
204 ; CHECK: slt $[[REG1:[0-9]+]], $[[REG_D]], $[[REG_C]]
205 ; CHECK: xori $[[REG2:[0-9]+]], $[[REG1]], 1
206 ; FIXME: This instruction is redundant. The slt can only produce 0 and 1.
207 ; CHECK: andi ${{[0-9]+}}, $[[REG2]], 1
208 store i32 %conv, i32* @b1, align 4