blob: 27a48e509deaba14a67bc3e06f4f4cb4d0cce0d9 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=mipsel -mcpu=mips32r6 < %s | FileCheck %s --check-prefix=MIPS32R6
; RUN: llc -mtriple=mips64el -mcpu=mips64r6 < %s | FileCheck %s --check-prefix=MIPS64R6
;; Each function is a single compare + branch
;; Checking each pattern for compact branch is selected
;; br + slt -> bgec
define void @test_slt(i32 %a, i32 %b) {
; MIPS32R6-LABEL: test_slt:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bgec $4, $5, $BB0_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB0_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_slt:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $5, 0
; MIPS64R6-NEXT: sll $2, $4, 0
; MIPS64R6-NEXT: bgec $2, $1, .LBB0_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB0_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp slt i32 %a, %b
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sgt -> bgec
define void @test_sgt(i32 %a, i32 %b) {
; MIPS32R6-LABEL: test_sgt:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bgec $5, $4, $BB1_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB1_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_sgt:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: sll $2, $5, 0
; MIPS64R6-NEXT: bgec $2, $1, .LBB1_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB1_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sgt i32 %a, %b
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sge -> bltc
define void @test_sge(i32 %a, i32 %b) {
; MIPS32R6-LABEL: test_sge:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bltc $4, $5, $BB2_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB2_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_sge:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $5, 0
; MIPS64R6-NEXT: sll $2, $4, 0
; MIPS64R6-NEXT: bltc $2, $1, .LBB2_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB2_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sge i32 %a, %b
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sle -> bltc
define void @test_sle(i32 %a, i32 %b) {
; MIPS32R6-LABEL: test_sle:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bltc $5, $4, $BB3_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB3_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_sle:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: sll $2, $5, 0
; MIPS64R6-NEXT: bltc $2, $1, .LBB3_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB3_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sle i32 %a, %b
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + ult -> bgeuc
define void @test_ult(i32 %a, i32 %b) {
; MIPS32R6-LABEL: test_ult:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bgeuc $4, $5, $BB4_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB4_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_ult:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $5, 0
; MIPS64R6-NEXT: sll $2, $4, 0
; MIPS64R6-NEXT: bgeuc $2, $1, .LBB4_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB4_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp ult i32 %a, %b
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + ugt -> bgeuc
define void @test_ugt(i32 %a, i32 %b) {
; MIPS32R6-LABEL: test_ugt:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bgeuc $5, $4, $BB5_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB5_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_ugt:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: sll $2, $5, 0
; MIPS64R6-NEXT: bgeuc $2, $1, .LBB5_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB5_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp ugt i32 %a, %b
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + uge -> bltuc
define void @test_uge(i32 %a, i32 %b) {
; MIPS32R6-LABEL: test_uge:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bltuc $4, $5, $BB6_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB6_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_uge:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $5, 0
; MIPS64R6-NEXT: sll $2, $4, 0
; MIPS64R6-NEXT: bltuc $2, $1, .LBB6_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB6_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp uge i32 %a, %b
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + ule -> bltuc
define void @test_ule(i32 %a, i32 %b) {
; MIPS32R6-LABEL: test_ule:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bltuc $5, $4, $BB7_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB7_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_ule:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: sll $2, $5, 0
; MIPS64R6-NEXT: bltuc $2, $1, .LBB7_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB7_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp ule i32 %a, %b
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + slt rs,0 -> bltzc
define void @test_lt_zero(i32 %a) {
; MIPS32R6-LABEL: test_lt_zero:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bltzc $4, $BB8_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %f
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB8_2: # %t
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_lt_zero:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: bltzc $1, .LBB8_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %f
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB8_2: # %t
; MIPS64R6-NEXT: jrc $ra
%c = icmp slt i32 %a, 0
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sgt rs,0 -> blezc
define void @test_gt_zero(i32 %a) {
; MIPS32R6-LABEL: test_gt_zero:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: blezc $4, $BB9_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB9_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_gt_zero:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: blezc $1, .LBB9_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB9_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sgt i32 %a, 0
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sle rs,0 -> bgtzc
define void @test_le_zero(i32 %a) {
; MIPS32R6-LABEL: test_le_zero:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bgtzc $4, $BB10_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB10_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_le_zero:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: bgtzc $1, .LBB10_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB10_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sle i32 %a, 0
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sge rs,0 -> bltzc
define void @test_ge_zero(i32 %a) {
; MIPS32R6-LABEL: test_ge_zero:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bltzc $4, $BB11_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB11_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_ge_zero:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: bltzc $1, .LBB11_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB11_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sge i32 %a, 0
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + slt rs,1 -> blezc
define void @test_lt_one(i32 %a) {
; MIPS32R6-LABEL: test_lt_one:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: blezc $4, $BB12_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %f
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB12_2: # %t
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_lt_one:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: blezc $1, .LBB12_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %f
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB12_2: # %t
; MIPS64R6-NEXT: jrc $ra
%c = icmp slt i32 %a, 1
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sge rs,1 -> blezc
define void @test_ge_one(i32 %a) {
; MIPS32R6-LABEL: test_ge_one:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: blezc $4, $BB13_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB13_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_ge_one:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: blezc $1, .LBB13_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB13_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sge i32 %a, 1
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sgt rs,-1 -> bltzc
define void @test_gt_minus1(i32 %a) {
; MIPS32R6-LABEL: test_gt_minus1:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bltzc $4, $BB14_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB14_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_gt_minus1:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: bltzc $1, .LBB14_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB14_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sgt i32 %a, -1
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}
;; br + sle rs,-1 -> bgezc
define void @test_le_minus1(i32 %a) {
; MIPS32R6-LABEL: test_le_minus1:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: bgezc $4, $BB15_2
; MIPS32R6-NEXT: nop
; MIPS32R6-NEXT: # %bb.1: # %t
; MIPS32R6-NEXT: jrc $ra
; MIPS32R6-NEXT: $BB15_2: # %f
; MIPS32R6-NEXT: jrc $ra
;
; MIPS64R6-LABEL: test_le_minus1:
; MIPS64R6: # %bb.0:
; MIPS64R6-NEXT: sll $1, $4, 0
; MIPS64R6-NEXT: bgezc $1, .LBB15_2
; MIPS64R6-NEXT: nop
; MIPS64R6-NEXT: # %bb.1: # %t
; MIPS64R6-NEXT: jrc $ra
; MIPS64R6-NEXT: .LBB15_2: # %f
; MIPS64R6-NEXT: jrc $ra
%c = icmp sle i32 %a, -1
br i1 %c, label %t, label %f
t:
ret void
f:
ret void
}