; Tests for conditional branch instructions ; RUN: %if --need=allow_dump --need=target_MIPS32 --command %p2i \ ; RUN: --filetype=asm --target mips32 -i %s --args -O2 \ ; RUN: -allow-externally-defined-symbols \ ; RUN: | %if --need=allow_dump --need=target_MIPS32 --command FileCheck %s \ ; RUN: --check-prefix=COMMON --check-prefix=MIPS32 ; RUN: %if --need=allow_dump --need=target_MIPS32 --command %p2i \ ; RUN: --filetype=asm --target mips32 -i %s --args -Om1 \ ; RUN: -allow-externally-defined-symbols \ ; RUN: | %if --need=allow_dump --need=target_MIPS32 --command FileCheck %s \ ; RUN: --check-prefix=COMMON --check-prefix=MIPS32-OM1 define internal i32 @cond_br_eq(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp eq i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_eq ; MIPS32: bne {{.*}} .Lcond_br_eq$branch2 ; MIPS32-NEXT: .Lcond_br_eq$branch1 ; MIPS32-OM1: xor ; MIPS32-OM1: sltiu {{.*}}, {{.*}}, 1 ; MIPS32-OM1: beqz {{.*}} .Lcond_br_eq$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_eq$branch1 define internal i32 @cond_br_ne(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp ne i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_ne ; MIPS32: beq {{.*}} .Lcond_br_ne$branch2 ; MIPS32-NEXT: .Lcond_br_ne$branch1 ; MIPS32-OM1: xor ; MIPS32-OM1: sltu {{.*}}, $zero, {{.*}} ; MIPS32-OM1: beqz {{.*}} .Lcond_br_ne$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_ne$branch1 define internal i32 @cond_br_slt(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp slt i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_slt ; MIPS32: slt ; MIPS32: beqz {{.*}} .Lcond_br_slt$branch2 ; MIPS32-NEXT: .Lcond_br_slt$branch1 ; MIPS32-OM1: slt ; MIPS32-OM1: beqz {{.*}} .Lcond_br_slt$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_slt$branch1 define internal i32 @cond_br_sle(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp sle i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_sle ; MIPS32: slt ; MIPS32: bnez {{.*}} .Lcond_br_sle$branch2 ; MIPS32-NEXT: .Lcond_br_sle$branch1 ; MIPS32-OM1: slt ; MIPS32-OM1: xori {{.*}}, {{.*}}, 1 ; MIPS32-OM1: beqz {{.*}} .Lcond_br_sle$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_sle$branch1 define internal i32 @cond_br_sgt(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp sgt i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_sgt ; MIPS32: slt ; MIPS32-NEXT: beqz {{.*}} .Lcond_br_sgt$branch2 ; MIPS32-NEXT: .Lcond_br_sgt$branch1 ; MIPS32-OM1: slt ; MIPS32-OM1: beqz {{.*}} .Lcond_br_sgt$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_sgt$branch1 define internal i32 @cond_br_sge(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp sge i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_sge ; MIPS32: slt ; MIPS32: bnez {{.*}} .Lcond_br_sge$branch2 ; MIPS32-NEXT: .Lcond_br_sge$branch1 ; MIPS32-OM1: slt ; MIPS32-OM1: xori {{.*}}, {{.*}}, 1 ; MIPS32-OM1: beqz {{.*}} .Lcond_br_sge$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_sge$branch1 define internal i32 @cond_br_ugt(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp ugt i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_ugt ; MIPS32: sltu ; MIPS32: beqz {{.*}} .Lcond_br_ugt$branch2 ; MIPS32-NEXT: .Lcond_br_ugt$branch1 ; MIPS32-OM1: sltu ; MIPS32-OM1: beqz {{.*}} .Lcond_br_ugt$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_ugt$branch1 define internal i32 @cond_br_uge(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp uge i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_uge ; MIPS32: sltu ; MIPS32: bnez {{.*}} .Lcond_br_uge$branch2 ; MIPS32-NEXT: .Lcond_br_uge$branch1 ; MIPS32-OM1: sltu ; MIPS32-OM1: xori {{.*}}, {{.*}}, 1 ; MIPS32-OM1: beqz {{.*}} .Lcond_br_uge$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_uge$branch1 define internal i32 @cond_br_ult(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp ult i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_ult ; MIPS32: sltu ; MIPS32: beqz {{.*}} .Lcond_br_ult$branch2 ; MIPS32-NEXT: .Lcond_br_ult$branch1 ; MIPS32-OM1: sltu ; MIPS32-OM1: beqz {{.*}} .Lcond_br_ult$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_ult$branch1 define internal i32 @cond_br_ule(i32 %arg1, i32 %arg2) { entry: %cmp1 = icmp ule i32 %arg1, %arg2 br i1 %cmp1, label %branch1, label %branch2 branch1: ret i32 1 branch2: ret i32 2 } ; COMMON-LABEL: cond_br_ule ; MIPS32: sltu ; MIPS32: bnez {{.*}} .Lcond_br_ule$branch2 ; MIPS32-NEXT: .Lcond_br_ule$branch1 ; MIPS32-OM1: sltu ; MIPS32-OM1: xori {{.*}}, {{.*}}, 1 ; MIPS32-OM1: beqz {{.*}} .Lcond_br_ule$branch2 ; MIPS32-OM1-NEXT: b .Lcond_br_ule$branch1