@@ -258,3 +258,246 @@ define i32 @neg_range_int(i32 %a, i32 %b, i32 %c) {
258258 ret i32 %retval.0
259259}
260260
261+ ; (b > -(d | 1) && a < c)
262+ define i32 @neg_range_int_comp (i32 %a , i32 %b , i32 %c , i32 %d ) {
263+ ; SDISEL-LABEL: neg_range_int_comp:
264+ ; SDISEL: // %bb.0:
265+ ; SDISEL-NEXT: orr w8, w3, #0x1
266+ ; SDISEL-NEXT: cmp w0, w2
267+ ; SDISEL-NEXT: ccmn w1, w8, #4, lt
268+ ; SDISEL-NEXT: csel w0, w1, w0, gt
269+ ; SDISEL-NEXT: ret
270+ ;
271+ ; GISEL-LABEL: neg_range_int_comp:
272+ ; GISEL: // %bb.0:
273+ ; GISEL-NEXT: orr w8, w3, #0x1
274+ ; GISEL-NEXT: cmp w0, w2
275+ ; GISEL-NEXT: neg w8, w8
276+ ; GISEL-NEXT: ccmp w1, w8, #4, lt
277+ ; GISEL-NEXT: csel w0, w1, w0, gt
278+ ; GISEL-NEXT: ret
279+ %dor = or i32 %d , 1
280+ %negd = sub i32 0 , %dor
281+ %cmp = icmp sgt i32 %b , %negd
282+ %cmp1 = icmp slt i32 %a , %c
283+ %or.cond = and i1 %cmp , %cmp1
284+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
285+ ret i32 %retval.0
286+ }
287+
288+ ; (b >u -(d | 1) && a < c)
289+ define i32 @neg_range_int_comp_u (i32 %a , i32 %b , i32 %c , i32 %d ) {
290+ ; SDISEL-LABEL: neg_range_int_comp_u:
291+ ; SDISEL: // %bb.0:
292+ ; SDISEL-NEXT: orr w8, w3, #0x1
293+ ; SDISEL-NEXT: cmp w0, w2
294+ ; SDISEL-NEXT: ccmn w1, w8, #0, lt
295+ ; SDISEL-NEXT: csel w0, w1, w0, hi
296+ ; SDISEL-NEXT: ret
297+ ;
298+ ; GISEL-LABEL: neg_range_int_comp_u:
299+ ; GISEL: // %bb.0:
300+ ; GISEL-NEXT: orr w8, w3, #0x1
301+ ; GISEL-NEXT: cmp w0, w2
302+ ; GISEL-NEXT: neg w8, w8
303+ ; GISEL-NEXT: ccmp w1, w8, #0, lt
304+ ; GISEL-NEXT: csel w0, w1, w0, hi
305+ ; GISEL-NEXT: ret
306+ %dor = or i32 %d , 1
307+ %negd = sub i32 0 , %dor
308+ %cmp = icmp ugt i32 %b , %negd
309+ %cmp1 = icmp slt i32 %a , %c
310+ %or.cond = and i1 %cmp , %cmp1
311+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
312+ ret i32 %retval.0
313+ }
314+
315+ ; (b > -(d | 1) && a u < c)
316+ define i32 @neg_range_int_comp_ua (i32 %a , i32 %b , i32 %c , i32 %d ) {
317+ ; SDISEL-LABEL: neg_range_int_comp_ua:
318+ ; SDISEL: // %bb.0:
319+ ; SDISEL-NEXT: orr w8, w3, #0x1
320+ ; SDISEL-NEXT: cmp w0, w2
321+ ; SDISEL-NEXT: ccmn w1, w8, #4, lo
322+ ; SDISEL-NEXT: csel w0, w1, w0, gt
323+ ; SDISEL-NEXT: ret
324+ ;
325+ ; GISEL-LABEL: neg_range_int_comp_ua:
326+ ; GISEL: // %bb.0:
327+ ; GISEL-NEXT: orr w8, w3, #0x1
328+ ; GISEL-NEXT: cmp w0, w2
329+ ; GISEL-NEXT: neg w8, w8
330+ ; GISEL-NEXT: ccmp w1, w8, #4, lo
331+ ; GISEL-NEXT: csel w0, w1, w0, gt
332+ ; GISEL-NEXT: ret
333+ %dor = or i32 %d , 1
334+ %negd = sub i32 0 , %dor
335+ %cmp = icmp sgt i32 %b , %negd
336+ %cmp1 = icmp ult i32 %a , %c
337+ %or.cond = and i1 %cmp , %cmp1
338+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
339+ ret i32 %retval.0
340+ }
341+
342+ ; (b <= -3 && a > c)
343+ define i32 @neg_range_int_2 (i32 %a , i32 %b , i32 %c ) {
344+ ; SDISEL-LABEL: neg_range_int_2:
345+ ; SDISEL: // %bb.0:
346+ ; SDISEL-NEXT: cmp w0, w2
347+ ; SDISEL-NEXT: ccmn w1, #4, #4, gt
348+ ; SDISEL-NEXT: csel w0, w1, w0, gt
349+ ; SDISEL-NEXT: ret
350+ ;
351+ ; GISEL-LABEL: neg_range_int_2:
352+ ; GISEL: // %bb.0:
353+ ; GISEL-NEXT: cmp w0, w2
354+ ; GISEL-NEXT: ccmn w1, #3, #8, gt
355+ ; GISEL-NEXT: csel w0, w1, w0, ge
356+ ; GISEL-NEXT: ret
357+ %cmp = icmp sge i32 %b , -3
358+ %cmp1 = icmp sgt i32 %a , %c
359+ %or.cond = and i1 %cmp , %cmp1
360+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
361+ ret i32 %retval.0
362+ }
363+
364+ ; (b < -(d | 1) && a >= c)
365+ define i32 @neg_range_int_comp2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
366+ ; SDISEL-LABEL: neg_range_int_comp2:
367+ ; SDISEL: // %bb.0:
368+ ; SDISEL-NEXT: orr w8, w3, #0x1
369+ ; SDISEL-NEXT: cmp w0, w2
370+ ; SDISEL-NEXT: ccmn w1, w8, #0, ge
371+ ; SDISEL-NEXT: csel w0, w1, w0, lt
372+ ; SDISEL-NEXT: ret
373+ ;
374+ ; GISEL-LABEL: neg_range_int_comp2:
375+ ; GISEL: // %bb.0:
376+ ; GISEL-NEXT: orr w8, w3, #0x1
377+ ; GISEL-NEXT: cmp w0, w2
378+ ; GISEL-NEXT: neg w8, w8
379+ ; GISEL-NEXT: ccmp w1, w8, #0, ge
380+ ; GISEL-NEXT: csel w0, w1, w0, lt
381+ ; GISEL-NEXT: ret
382+ %dor = or i32 %d , 1
383+ %negd = sub i32 0 , %dor
384+ %cmp = icmp slt i32 %b , %negd
385+ %cmp1 = icmp sge i32 %a , %c
386+ %or.cond = and i1 %cmp , %cmp1
387+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
388+ ret i32 %retval.0
389+ }
390+
391+ ; (b <u -(d | 1) && a > c)
392+ define i32 @neg_range_int_comp_u2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
393+ ; SDISEL-LABEL: neg_range_int_comp_u2:
394+ ; SDISEL: // %bb.0:
395+ ; SDISEL-NEXT: orr w8, w3, #0x1
396+ ; SDISEL-NEXT: cmp w0, w2
397+ ; SDISEL-NEXT: ccmn w1, w8, #2, gt
398+ ; SDISEL-NEXT: csel w0, w1, w0, lo
399+ ; SDISEL-NEXT: ret
400+ ;
401+ ; GISEL-LABEL: neg_range_int_comp_u2:
402+ ; GISEL: // %bb.0:
403+ ; GISEL-NEXT: orr w8, w3, #0x1
404+ ; GISEL-NEXT: cmp w0, w2
405+ ; GISEL-NEXT: neg w8, w8
406+ ; GISEL-NEXT: ccmp w1, w8, #2, gt
407+ ; GISEL-NEXT: csel w0, w1, w0, lo
408+ ; GISEL-NEXT: ret
409+ %dor = or i32 %d , 1
410+ %negd = sub i32 0 , %dor
411+ %cmp = icmp ult i32 %b , %negd
412+ %cmp1 = icmp sgt i32 %a , %c
413+ %or.cond = and i1 %cmp , %cmp1
414+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
415+ ret i32 %retval.0
416+ }
417+
418+ ; (b > -(d | 1) && a u > c)
419+ define i32 @neg_range_int_comp_ua2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
420+ ; SDISEL-LABEL: neg_range_int_comp_ua2:
421+ ; SDISEL: // %bb.0:
422+ ; SDISEL-NEXT: orr w8, w3, #0x1
423+ ; SDISEL-NEXT: cmp w0, w2
424+ ; SDISEL-NEXT: ccmn w1, w8, #4, hi
425+ ; SDISEL-NEXT: csel w0, w1, w0, gt
426+ ; SDISEL-NEXT: ret
427+ ;
428+ ; GISEL-LABEL: neg_range_int_comp_ua2:
429+ ; GISEL: // %bb.0:
430+ ; GISEL-NEXT: orr w8, w3, #0x1
431+ ; GISEL-NEXT: cmp w0, w2
432+ ; GISEL-NEXT: neg w8, w8
433+ ; GISEL-NEXT: ccmp w1, w8, #4, hi
434+ ; GISEL-NEXT: csel w0, w1, w0, gt
435+ ; GISEL-NEXT: ret
436+ %dor = or i32 %d , 1
437+ %negd = sub i32 0 , %dor
438+ %cmp = icmp sgt i32 %b , %negd
439+ %cmp1 = icmp ugt i32 %a , %c
440+ %or.cond = and i1 %cmp , %cmp1
441+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
442+ ret i32 %retval.0
443+ }
444+
445+ ; (b > -(d | 1) && a u == c)
446+ define i32 @neg_range_int_comp_ua3 (i32 %a , i32 %b , i32 %c , i32 %d ) {
447+ ; SDISEL-LABEL: neg_range_int_comp_ua3:
448+ ; SDISEL: // %bb.0:
449+ ; SDISEL-NEXT: orr w8, w3, #0x1
450+ ; SDISEL-NEXT: cmp w0, w2
451+ ; SDISEL-NEXT: ccmn w1, w8, #4, eq
452+ ; SDISEL-NEXT: csel w0, w1, w0, gt
453+ ; SDISEL-NEXT: ret
454+ ;
455+ ; GISEL-LABEL: neg_range_int_comp_ua3:
456+ ; GISEL: // %bb.0:
457+ ; GISEL-NEXT: orr w8, w3, #0x1
458+ ; GISEL-NEXT: cmp w0, w2
459+ ; GISEL-NEXT: neg w8, w8
460+ ; GISEL-NEXT: ccmp w1, w8, #4, eq
461+ ; GISEL-NEXT: csel w0, w1, w0, gt
462+ ; GISEL-NEXT: ret
463+ %dor = or i32 %d , 1
464+ %negd = sub i32 0 , %dor
465+ %cmp = icmp sgt i32 %b , %negd
466+ %cmp1 = icmp eq i32 %a , %c
467+ %or.cond = and i1 %cmp , %cmp1
468+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
469+ ret i32 %retval.0
470+ }
471+
472+ ; -(a | 1) > (b | 3) && a < c
473+ define i32 @neg_range_int_c (i32 %a , i32 %b , i32 %c ) {
474+ ; SDISEL-LABEL: neg_range_int_c:
475+ ; SDISEL: // %bb.0: // %entry
476+ ; SDISEL-NEXT: orr w8, w0, #0x1
477+ ; SDISEL-NEXT: orr w9, w1, #0x3
478+ ; SDISEL-NEXT: cmn w9, w8
479+ ; SDISEL-NEXT: ccmp w2, w0, #2, lo
480+ ; SDISEL-NEXT: cset w0, lo
481+ ; SDISEL-NEXT: ret
482+ ;
483+ ; GISEL-LABEL: neg_range_int_c:
484+ ; GISEL: // %bb.0: // %entry
485+ ; GISEL-NEXT: orr w8, w0, #0x1
486+ ; GISEL-NEXT: orr w9, w1, #0x3
487+ ; GISEL-NEXT: neg w8, w8
488+ ; GISEL-NEXT: cmp w9, w8
489+ ; GISEL-NEXT: cset w8, lo
490+ ; GISEL-NEXT: cmp w2, w0
491+ ; GISEL-NEXT: cset w9, lo
492+ ; GISEL-NEXT: and w0, w8, w9
493+ ; GISEL-NEXT: ret
494+ entry:
495+ %or = or i32 %a , 1
496+ %sub = sub i32 0 , %or
497+ %or1 = or i32 %b , 3
498+ %cmp = icmp ult i32 %or1 , %sub
499+ %cmp2 = icmp ult i32 %c , %a
500+ %0 = and i1 %cmp , %cmp2
501+ %land.ext = zext i1 %0 to i32
502+ ret i32 %land.ext
503+ }
0 commit comments