; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; Test that we are able to generate the Xqcibi instructions ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ ; RUN: | FileCheck %s --check-prefixes=RV32I ; RUN: llc -mtriple=riscv32 -mattr=+xqcibi -verify-machineinstrs < %s \ ; RUN: | FileCheck %s --check-prefixes=RV32IXQCIBI define i32 @beqimm(i32 %a) { ; RV32I-LABEL: beqimm: ; RV32I: # %bb.0: ; RV32I-NEXT: li a1, -16 ; RV32I-NEXT: beq a0, a1, .LBB0_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB0_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: beqimm: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.beqi a0, -16, .LBB0_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB0_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp eq i32 %a, -16 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bneimm(i32 %a) { ; RV32I-LABEL: bneimm: ; RV32I: # %bb.0: ; RV32I-NEXT: li a1, 15 ; RV32I-NEXT: bne a0, a1, .LBB1_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB1_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bneimm: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.bnei a0, 15, .LBB1_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB1_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp ne i32 %a, 15 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bltimm(i32 %a) { ; RV32I-LABEL: bltimm: ; RV32I: # %bb.0: ; RV32I-NEXT: li a1, 5 ; RV32I-NEXT: blt a0, a1, .LBB2_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB2_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bltimm: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.blti a0, 5, .LBB2_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB2_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp slt i32 %a, 5 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bgeimm(i32 %a) { ; RV32I-LABEL: bgeimm: ; RV32I: # %bb.0: ; RV32I-NEXT: li a1, -6 ; RV32I-NEXT: blt a1, a0, .LBB3_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB3_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bgeimm: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.bgei a0, -5, .LBB3_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB3_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp sge i32 %a, -5 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bltuimm(i32 %a) { ; RV32I-LABEL: bltuimm: ; RV32I: # %bb.0: ; RV32I-NEXT: li a1, 31 ; RV32I-NEXT: bltu a0, a1, .LBB4_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB4_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bltuimm: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.bltui a0, 31, .LBB4_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB4_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp ult i32 %a, 31 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bgeuimm(i32 %a) { ; RV32I-LABEL: bgeuimm: ; RV32I: # %bb.0: ; RV32I-NEXT: li a1, 9 ; RV32I-NEXT: bltu a1, a0, .LBB5_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB5_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bgeuimm: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.bgeui a0, 10, .LBB5_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB5_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp uge i32 %a, 10 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @beqimm16(i32 %a) { ; RV32I-LABEL: beqimm16: ; RV32I: # %bb.0: ; RV32I-NEXT: lui a1, 1048568 ; RV32I-NEXT: beq a0, a1, .LBB6_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB6_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: beqimm16: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.e.beqi a0, -32768, .LBB6_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB6_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp eq i32 %a, -32768 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bneimm16(i32 %a) { ; RV32I-LABEL: bneimm16: ; RV32I: # %bb.0: ; RV32I-NEXT: lui a1, 8 ; RV32I-NEXT: addi a1, a1, -1 ; RV32I-NEXT: bne a0, a1, .LBB7_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB7_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bneimm16: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.e.bnei a0, 32767, .LBB7_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB7_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp ne i32 %a, 32767 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bltimm16(i32 %a) { ; RV32I-LABEL: bltimm16: ; RV32I: # %bb.0: ; RV32I-NEXT: li a1, -35 ; RV32I-NEXT: blt a0, a1, .LBB8_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB8_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bltimm16: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.e.blti a0, -35, .LBB8_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB8_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp slt i32 %a, -35 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bgeimm16(i32 %a) { ; RV32I-LABEL: bgeimm16: ; RV32I: # %bb.0: ; RV32I-NEXT: li a1, 254 ; RV32I-NEXT: blt a1, a0, .LBB9_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB9_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bgeimm16: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.e.bgei a0, 255, .LBB9_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB9_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp sge i32 %a, 255 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bltuimm16(i32 %a) { ; RV32I-LABEL: bltuimm16: ; RV32I: # %bb.0: ; RV32I-NEXT: lui a1, 16 ; RV32I-NEXT: addi a1, a1, -1 ; RV32I-NEXT: bltu a0, a1, .LBB10_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB10_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bltuimm16: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.e.bltui a0, 65535, .LBB10_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB10_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp ult i32 %a, 65535 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i32 @bgeuimm16(i32 %a) { ; RV32I-LABEL: bgeuimm16: ; RV32I: # %bb.0: ; RV32I-NEXT: lui a1, 16 ; RV32I-NEXT: addi a1, a1, -2 ; RV32I-NEXT: bltu a1, a0, .LBB11_2 ; RV32I-NEXT: # %bb.1: # %f ; RV32I-NEXT: li a0, 0 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB11_2: # %t ; RV32I-NEXT: li a0, 1 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: bgeuimm16: ; RV32IXQCIBI: # %bb.0: ; RV32IXQCIBI-NEXT: qc.e.bgeui a0, 65535, .LBB11_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %f ; RV32IXQCIBI-NEXT: li a0, 0 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB11_2: # %t ; RV32IXQCIBI-NEXT: li a0, 1 ; RV32IXQCIBI-NEXT: ret %1 = icmp uge i32 %a, 65535 br i1 %1, label %t, label %f, !prof !0 f: ret i32 0 t: ret i32 1 } define i1 @selectcc(i64 %0) { ; RV32I-LABEL: selectcc: ; RV32I: # %bb.0: # %entry ; RV32I-NEXT: li a2, 512 ; RV32I-NEXT: beq a1, a2, .LBB12_2 ; RV32I-NEXT: # %bb.1: # %entry ; RV32I-NEXT: sltiu a0, a1, 513 ; RV32I-NEXT: xori a0, a0, 1 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB12_2: ; RV32I-NEXT: snez a0, a0 ; RV32I-NEXT: ret ; ; RV32IXQCIBI-LABEL: selectcc: ; RV32IXQCIBI: # %bb.0: # %entry ; RV32IXQCIBI-NEXT: qc.e.beqi a1, 512, .LBB12_2 ; RV32IXQCIBI-NEXT: # %bb.1: # %entry ; RV32IXQCIBI-NEXT: sltiu a0, a1, 513 ; RV32IXQCIBI-NEXT: xori a0, a0, 1 ; RV32IXQCIBI-NEXT: ret ; RV32IXQCIBI-NEXT: .LBB12_2: ; RV32IXQCIBI-NEXT: snez a0, a0 ; RV32IXQCIBI-NEXT: ret entry: %cmp10.i = icmp ugt i64 %0, 2199023255552 ret i1 %cmp10.i } !0 = !{!"branch_weights", i32 1, i32 99}