@@ -118,3 +118,195 @@ define i1 @and_icmps_const_not1bit_diff(i32 %x) nounwind {
118
118
%r = and i1 %a , %b
119
119
ret i1 %r
120
120
}
121
+
122
+ define i1 @and_icmp_sge (i32 signext %a , i32 signext %b , i32 signext %c , i32 signext %d ) nounwind {
123
+ ; RV32I-LABEL: and_icmp_sge:
124
+ ; RV32I: # %bb.0:
125
+ ; RV32I-NEXT: slt a0, a0, a1
126
+ ; RV32I-NEXT: not a0, a0
127
+ ; RV32I-NEXT: slt a1, a2, a3
128
+ ; RV32I-NEXT: xori a1, a1, 1
129
+ ; RV32I-NEXT: and a0, a0, a1
130
+ ; RV32I-NEXT: ret
131
+ ;
132
+ ; RV64I-LABEL: and_icmp_sge:
133
+ ; RV64I: # %bb.0:
134
+ ; RV64I-NEXT: slt a0, a0, a1
135
+ ; RV64I-NEXT: not a0, a0
136
+ ; RV64I-NEXT: slt a1, a2, a3
137
+ ; RV64I-NEXT: xori a1, a1, 1
138
+ ; RV64I-NEXT: and a0, a0, a1
139
+ ; RV64I-NEXT: ret
140
+ %cmp1 = icmp sge i32 %a , %b
141
+ %cmp2 = icmp sge i32 %c , %d
142
+ %and = and i1 %cmp1 , %cmp2
143
+ ret i1 %and
144
+ }
145
+
146
+ define i1 @and_icmp_sle (i32 signext %a , i32 signext %b , i32 signext %c , i32 signext %d ) nounwind {
147
+ ; RV32I-LABEL: and_icmp_sle:
148
+ ; RV32I: # %bb.0:
149
+ ; RV32I-NEXT: slt a0, a1, a0
150
+ ; RV32I-NEXT: not a0, a0
151
+ ; RV32I-NEXT: slt a1, a3, a2
152
+ ; RV32I-NEXT: xori a1, a1, 1
153
+ ; RV32I-NEXT: and a0, a0, a1
154
+ ; RV32I-NEXT: ret
155
+ ;
156
+ ; RV64I-LABEL: and_icmp_sle:
157
+ ; RV64I: # %bb.0:
158
+ ; RV64I-NEXT: slt a0, a1, a0
159
+ ; RV64I-NEXT: not a0, a0
160
+ ; RV64I-NEXT: slt a1, a3, a2
161
+ ; RV64I-NEXT: xori a1, a1, 1
162
+ ; RV64I-NEXT: and a0, a0, a1
163
+ ; RV64I-NEXT: ret
164
+ %cmp1 = icmp sle i32 %a , %b
165
+ %cmp2 = icmp sle i32 %c , %d
166
+ %and = and i1 %cmp1 , %cmp2
167
+ ret i1 %and
168
+ }
169
+
170
+ define i1 @and_icmp_uge (i32 signext %a , i32 signext %b , i32 signext %c , i32 signext %d ) nounwind {
171
+ ; RV32I-LABEL: and_icmp_uge:
172
+ ; RV32I: # %bb.0:
173
+ ; RV32I-NEXT: sltu a0, a0, a1
174
+ ; RV32I-NEXT: not a0, a0
175
+ ; RV32I-NEXT: sltu a1, a2, a3
176
+ ; RV32I-NEXT: xori a1, a1, 1
177
+ ; RV32I-NEXT: and a0, a0, a1
178
+ ; RV32I-NEXT: ret
179
+ ;
180
+ ; RV64I-LABEL: and_icmp_uge:
181
+ ; RV64I: # %bb.0:
182
+ ; RV64I-NEXT: sltu a0, a0, a1
183
+ ; RV64I-NEXT: not a0, a0
184
+ ; RV64I-NEXT: sltu a1, a2, a3
185
+ ; RV64I-NEXT: xori a1, a1, 1
186
+ ; RV64I-NEXT: and a0, a0, a1
187
+ ; RV64I-NEXT: ret
188
+ %cmp1 = icmp uge i32 %a , %b
189
+ %cmp2 = icmp uge i32 %c , %d
190
+ %and = and i1 %cmp1 , %cmp2
191
+ ret i1 %and
192
+ }
193
+
194
+ define i1 @and_icmp_ule (i32 signext %a , i32 signext %b , i32 signext %c , i32 signext %d ) nounwind {
195
+ ; RV32I-LABEL: and_icmp_ule:
196
+ ; RV32I: # %bb.0:
197
+ ; RV32I-NEXT: sltu a0, a1, a0
198
+ ; RV32I-NEXT: not a0, a0
199
+ ; RV32I-NEXT: sltu a1, a3, a2
200
+ ; RV32I-NEXT: xori a1, a1, 1
201
+ ; RV32I-NEXT: and a0, a0, a1
202
+ ; RV32I-NEXT: ret
203
+ ;
204
+ ; RV64I-LABEL: and_icmp_ule:
205
+ ; RV64I: # %bb.0:
206
+ ; RV64I-NEXT: sltu a0, a1, a0
207
+ ; RV64I-NEXT: not a0, a0
208
+ ; RV64I-NEXT: sltu a1, a3, a2
209
+ ; RV64I-NEXT: xori a1, a1, 1
210
+ ; RV64I-NEXT: and a0, a0, a1
211
+ ; RV64I-NEXT: ret
212
+ %cmp1 = icmp ule i32 %a , %b
213
+ %cmp2 = icmp ule i32 %c , %d
214
+ %and = and i1 %cmp1 , %cmp2
215
+ ret i1 %and
216
+ }
217
+
218
+ define i1 @or_icmp_sge (i32 signext %a , i32 signext %b , i32 signext %c , i32 signext %d ) nounwind {
219
+ ; RV32I-LABEL: or_icmp_sge:
220
+ ; RV32I: # %bb.0:
221
+ ; RV32I-NEXT: slt a0, a0, a1
222
+ ; RV32I-NEXT: xori a0, a0, 1
223
+ ; RV32I-NEXT: slt a1, a2, a3
224
+ ; RV32I-NEXT: xori a1, a1, 1
225
+ ; RV32I-NEXT: or a0, a0, a1
226
+ ; RV32I-NEXT: ret
227
+ ;
228
+ ; RV64I-LABEL: or_icmp_sge:
229
+ ; RV64I: # %bb.0:
230
+ ; RV64I-NEXT: slt a0, a0, a1
231
+ ; RV64I-NEXT: xori a0, a0, 1
232
+ ; RV64I-NEXT: slt a1, a2, a3
233
+ ; RV64I-NEXT: xori a1, a1, 1
234
+ ; RV64I-NEXT: or a0, a0, a1
235
+ ; RV64I-NEXT: ret
236
+ %cmp1 = icmp sge i32 %a , %b
237
+ %cmp2 = icmp sge i32 %c , %d
238
+ %and = or i1 %cmp1 , %cmp2
239
+ ret i1 %and
240
+ }
241
+
242
+ define i1 @or_icmp_sle (i32 signext %a , i32 signext %b , i32 signext %c , i32 signext %d ) nounwind {
243
+ ; RV32I-LABEL: or_icmp_sle:
244
+ ; RV32I: # %bb.0:
245
+ ; RV32I-NEXT: slt a0, a1, a0
246
+ ; RV32I-NEXT: xori a0, a0, 1
247
+ ; RV32I-NEXT: slt a1, a3, a2
248
+ ; RV32I-NEXT: xori a1, a1, 1
249
+ ; RV32I-NEXT: or a0, a0, a1
250
+ ; RV32I-NEXT: ret
251
+ ;
252
+ ; RV64I-LABEL: or_icmp_sle:
253
+ ; RV64I: # %bb.0:
254
+ ; RV64I-NEXT: slt a0, a1, a0
255
+ ; RV64I-NEXT: xori a0, a0, 1
256
+ ; RV64I-NEXT: slt a1, a3, a2
257
+ ; RV64I-NEXT: xori a1, a1, 1
258
+ ; RV64I-NEXT: or a0, a0, a1
259
+ ; RV64I-NEXT: ret
260
+ %cmp1 = icmp sle i32 %a , %b
261
+ %cmp2 = icmp sle i32 %c , %d
262
+ %and = or i1 %cmp1 , %cmp2
263
+ ret i1 %and
264
+ }
265
+
266
+ define i1 @or_icmp_uge (i32 signext %a , i32 signext %b , i32 signext %c , i32 signext %d ) nounwind {
267
+ ; RV32I-LABEL: or_icmp_uge:
268
+ ; RV32I: # %bb.0:
269
+ ; RV32I-NEXT: sltu a0, a0, a1
270
+ ; RV32I-NEXT: xori a0, a0, 1
271
+ ; RV32I-NEXT: sltu a1, a2, a3
272
+ ; RV32I-NEXT: xori a1, a1, 1
273
+ ; RV32I-NEXT: or a0, a0, a1
274
+ ; RV32I-NEXT: ret
275
+ ;
276
+ ; RV64I-LABEL: or_icmp_uge:
277
+ ; RV64I: # %bb.0:
278
+ ; RV64I-NEXT: sltu a0, a0, a1
279
+ ; RV64I-NEXT: xori a0, a0, 1
280
+ ; RV64I-NEXT: sltu a1, a2, a3
281
+ ; RV64I-NEXT: xori a1, a1, 1
282
+ ; RV64I-NEXT: or a0, a0, a1
283
+ ; RV64I-NEXT: ret
284
+ %cmp1 = icmp uge i32 %a , %b
285
+ %cmp2 = icmp uge i32 %c , %d
286
+ %and = or i1 %cmp1 , %cmp2
287
+ ret i1 %and
288
+ }
289
+
290
+ define i1 @or_icmp_ule (i32 signext %a , i32 signext %b , i32 signext %c , i32 signext %d ) nounwind {
291
+ ; RV32I-LABEL: or_icmp_ule:
292
+ ; RV32I: # %bb.0:
293
+ ; RV32I-NEXT: sltu a0, a1, a0
294
+ ; RV32I-NEXT: xori a0, a0, 1
295
+ ; RV32I-NEXT: sltu a1, a3, a2
296
+ ; RV32I-NEXT: xori a1, a1, 1
297
+ ; RV32I-NEXT: or a0, a0, a1
298
+ ; RV32I-NEXT: ret
299
+ ;
300
+ ; RV64I-LABEL: or_icmp_ule:
301
+ ; RV64I: # %bb.0:
302
+ ; RV64I-NEXT: sltu a0, a1, a0
303
+ ; RV64I-NEXT: xori a0, a0, 1
304
+ ; RV64I-NEXT: sltu a1, a3, a2
305
+ ; RV64I-NEXT: xori a1, a1, 1
306
+ ; RV64I-NEXT: or a0, a0, a1
307
+ ; RV64I-NEXT: ret
308
+ %cmp1 = icmp ule i32 %a , %b
309
+ %cmp2 = icmp ule i32 %c , %d
310
+ %and = or i1 %cmp1 , %cmp2
311
+ ret i1 %and
312
+ }
0 commit comments