blob: 242012b5ad4626b83efed3f40b1ebbfcd17d9933 [file] [log] [blame]
; 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=+experimental-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: li a1, 99
; 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, 100, .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, 100
br i1 %1, label %t, label %f, !prof !0
f:
ret i32 0
t:
ret i32 1
}
!0 = !{!"branch_weights", i32 1, i32 99}