; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv64 -mattr=+c,+m -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=CHECK,NOSFB %s
; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=CHECK,SFB %s
define signext i32 @sdiv2_32(i32 signext %0) {
; NOSFB-LABEL: sdiv2_32:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srliw a1, a0, 31
; NOSFB-NEXT: add a0, a0, a1
; NOSFB-NEXT: sraiw a0, a0, 1
; NOSFB-NEXT: ret
;
; SFB-LABEL: sdiv2_32:
; SFB: # %bb.0:
; SFB-NEXT: bgez a0, .LBB0_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a0, a0, 1
; SFB-NEXT: .LBB0_2:
; SFB-NEXT: sraiw a0, a0, 1
; SFB-NEXT: ret
%res = sdiv i32 %0, 2
ret i32 %res
}
define signext i32 @sdivneg2_32(i32 signext %0) {
; NOSFB-LABEL: sdivneg2_32:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srliw a1, a0, 31
; NOSFB-NEXT: add a0, a0, a1
; NOSFB-NEXT: sraiw a0, a0, 1
; NOSFB-NEXT: neg a0, a0
; NOSFB-NEXT: ret
;
; SFB-LABEL: sdivneg2_32:
; SFB: # %bb.0:
; SFB-NEXT: bgez a0, .LBB1_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a0, a0, 1
; SFB-NEXT: .LBB1_2:
; SFB-NEXT: sraiw a0, a0, 1
; SFB-NEXT: neg a0, a0
; SFB-NEXT: ret
%res = sdiv i32 %0, -2
ret i32 %res
}
define i64 @sdiv2_64(i64 %0) {
; NOSFB-LABEL: sdiv2_64:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srli a1, a0, 63
; NOSFB-NEXT: add a0, a0, a1
; NOSFB-NEXT: srai a0, a0, 1
; NOSFB-NEXT: ret
;
; SFB-LABEL: sdiv2_64:
; SFB: # %bb.0:
; SFB-NEXT: bgez a0, .LBB2_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a0, a0, 1
; SFB-NEXT: .LBB2_2:
; SFB-NEXT: srai a0, a0, 1
; SFB-NEXT: ret
%res = sdiv i64 %0, 2
ret i64 %res
}
define i64 @sdivneg2_64(i64 %0) {
; NOSFB-LABEL: sdivneg2_64:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srli a1, a0, 63
; NOSFB-NEXT: add a0, a0, a1
; NOSFB-NEXT: srai a0, a0, 1
; NOSFB-NEXT: neg a0, a0
; NOSFB-NEXT: ret
;
; SFB-LABEL: sdivneg2_64:
; SFB: # %bb.0:
; SFB-NEXT: bgez a0, .LBB3_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a0, a0, 1
; SFB-NEXT: .LBB3_2:
; SFB-NEXT: srai a0, a0, 1
; SFB-NEXT: neg a0, a0
; SFB-NEXT: ret
%res = sdiv i64 %0, -2
ret i64 %res
}
define signext i32 @srem2_32(i32 signext %0) {
; NOSFB-LABEL: srem2_32:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srliw a1, a0, 31
; NOSFB-NEXT: add a1, a1, a0
; NOSFB-NEXT: andi a1, a1, -2
; NOSFB-NEXT: subw a0, a0, a1
; NOSFB-NEXT: ret
;
; SFB-LABEL: srem2_32:
; SFB: # %bb.0:
; SFB-NEXT: mv a1, a0
; SFB-NEXT: bgez a0, .LBB4_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a1, a0, 1
; SFB-NEXT: .LBB4_2:
; SFB-NEXT: andi a1, a1, -2
; SFB-NEXT: subw a0, a0, a1
; SFB-NEXT: ret
%res = srem i32 %0, 2
ret i32 %res
}
define signext i32 @sremneg2_32(i32 signext %0) {
; NOSFB-LABEL: sremneg2_32:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srliw a1, a0, 31
; NOSFB-NEXT: add a1, a1, a0
; NOSFB-NEXT: andi a1, a1, -2
; NOSFB-NEXT: subw a0, a0, a1
; NOSFB-NEXT: ret
;
; SFB-LABEL: sremneg2_32:
; SFB: # %bb.0:
; SFB-NEXT: mv a1, a0
; SFB-NEXT: bgez a0, .LBB5_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a1, a0, 1
; SFB-NEXT: .LBB5_2:
; SFB-NEXT: andi a1, a1, -2
; SFB-NEXT: subw a0, a0, a1
; SFB-NEXT: ret
%res = srem i32 %0, -2
ret i32 %res
}
define i64 @srem2_64(i64 %0) {
; NOSFB-LABEL: srem2_64:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srli a1, a0, 63
; NOSFB-NEXT: add a1, a1, a0
; NOSFB-NEXT: andi a1, a1, -2
; NOSFB-NEXT: sub a0, a0, a1
; NOSFB-NEXT: ret
;
; SFB-LABEL: srem2_64:
; SFB: # %bb.0:
; SFB-NEXT: mv a1, a0
; SFB-NEXT: bgez a0, .LBB6_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a1, a0, 1
; SFB-NEXT: .LBB6_2:
; SFB-NEXT: andi a1, a1, -2
; SFB-NEXT: sub a0, a0, a1
; SFB-NEXT: ret
%res = srem i64 %0, 2
ret i64 %res
}
define i64 @sremneg2_64(i64 %0) {
; NOSFB-LABEL: sremneg2_64:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srli a1, a0, 63
; NOSFB-NEXT: add a1, a1, a0
; NOSFB-NEXT: andi a1, a1, -2
; NOSFB-NEXT: sub a0, a0, a1
; NOSFB-NEXT: ret
;
; SFB-LABEL: sremneg2_64:
; SFB: # %bb.0:
; SFB-NEXT: mv a1, a0
; SFB-NEXT: bgez a0, .LBB7_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a1, a0, 1
; SFB-NEXT: .LBB7_2:
; SFB-NEXT: andi a1, a1, -2
; SFB-NEXT: sub a0, a0, a1
; SFB-NEXT: ret
%res = srem i64 %0, -2
ret i64 %res
}
define signext i32 @sdiv8_32(i32 signext %0) {
; NOSFB-LABEL: sdiv8_32:
; NOSFB: # %bb.0:
; NOSFB-NEXT: slli a1, a0, 1
; NOSFB-NEXT: srli a1, a1, 61
; NOSFB-NEXT: add a0, a0, a1
; NOSFB-NEXT: sraiw a0, a0, 3
; NOSFB-NEXT: ret
;
; SFB-LABEL: sdiv8_32:
; SFB: # %bb.0:
; SFB-NEXT: bgez a0, .LBB8_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a0, a0, 7
; SFB-NEXT: .LBB8_2:
; SFB-NEXT: sraiw a0, a0, 3
; SFB-NEXT: ret
%res = sdiv i32 %0, 8
ret i32 %res
}
define signext i32 @sdivneg8_32(i32 signext %0) {
; NOSFB-LABEL: sdivneg8_32:
; NOSFB: # %bb.0:
; NOSFB-NEXT: slli a1, a0, 1
; NOSFB-NEXT: srli a1, a1, 61
; NOSFB-NEXT: add a0, a0, a1
; NOSFB-NEXT: sraiw a0, a0, 3
; NOSFB-NEXT: neg a0, a0
; NOSFB-NEXT: ret
;
; SFB-LABEL: sdivneg8_32:
; SFB: # %bb.0:
; SFB-NEXT: bgez a0, .LBB9_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a0, a0, 7
; SFB-NEXT: .LBB9_2:
; SFB-NEXT: sraiw a0, a0, 3
; SFB-NEXT: neg a0, a0
; SFB-NEXT: ret
%res = sdiv i32 %0, -8
ret i32 %res
}
define i64 @sdiv8_64(i64 %0) {
; NOSFB-LABEL: sdiv8_64:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srai a1, a0, 63
; NOSFB-NEXT: srli a1, a1, 61
; NOSFB-NEXT: add a0, a0, a1
; NOSFB-NEXT: srai a0, a0, 3
; NOSFB-NEXT: ret
;
; SFB-LABEL: sdiv8_64:
; SFB: # %bb.0:
; SFB-NEXT: bgez a0, .LBB10_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a0, a0, 7
; SFB-NEXT: .LBB10_2:
; SFB-NEXT: srai a0, a0, 3
; SFB-NEXT: ret
%res = sdiv i64 %0, 8
ret i64 %res
}
define i64 @sdivneg8_64(i64 %0) {
; NOSFB-LABEL: sdivneg8_64:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srai a1, a0, 63
; NOSFB-NEXT: srli a1, a1, 61
; NOSFB-NEXT: add a0, a0, a1
; NOSFB-NEXT: srai a0, a0, 3
; NOSFB-NEXT: neg a0, a0
; NOSFB-NEXT: ret
;
; SFB-LABEL: sdivneg8_64:
; SFB: # %bb.0:
; SFB-NEXT: bgez a0, .LBB11_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a0, a0, 7
; SFB-NEXT: .LBB11_2:
; SFB-NEXT: srai a0, a0, 3
; SFB-NEXT: neg a0, a0
; SFB-NEXT: ret
%res = sdiv i64 %0, -8
ret i64 %res
}
define signext i32 @srem8_32(i32 signext %0) {
; NOSFB-LABEL: srem8_32:
; NOSFB: # %bb.0:
; NOSFB-NEXT: slli a1, a0, 1
; NOSFB-NEXT: srli a1, a1, 61
; NOSFB-NEXT: add a1, a1, a0
; NOSFB-NEXT: andi a1, a1, -8
; NOSFB-NEXT: subw a0, a0, a1
; NOSFB-NEXT: ret
;
; SFB-LABEL: srem8_32:
; SFB: # %bb.0:
; SFB-NEXT: mv a1, a0
; SFB-NEXT: bgez a0, .LBB12_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a1, a0, 7
; SFB-NEXT: .LBB12_2:
; SFB-NEXT: andi a1, a1, -8
; SFB-NEXT: subw a0, a0, a1
; SFB-NEXT: ret
%res = srem i32 %0, 8
ret i32 %res
}
define signext i32 @sremneg8_32(i32 signext %0) {
; NOSFB-LABEL: sremneg8_32:
; NOSFB: # %bb.0:
; NOSFB-NEXT: slli a1, a0, 1
; NOSFB-NEXT: srli a1, a1, 61
; NOSFB-NEXT: add a1, a1, a0
; NOSFB-NEXT: andi a1, a1, -8
; NOSFB-NEXT: subw a0, a0, a1
; NOSFB-NEXT: ret
;
; SFB-LABEL: sremneg8_32:
; SFB: # %bb.0:
; SFB-NEXT: mv a1, a0
; SFB-NEXT: bgez a0, .LBB13_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a1, a0, 7
; SFB-NEXT: .LBB13_2:
; SFB-NEXT: andi a1, a1, -8
; SFB-NEXT: subw a0, a0, a1
; SFB-NEXT: ret
%res = srem i32 %0, -8
ret i32 %res
}
define i64 @srem8_64(i64 %0) {
; NOSFB-LABEL: srem8_64:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srai a1, a0, 63
; NOSFB-NEXT: srli a1, a1, 61
; NOSFB-NEXT: add a1, a1, a0
; NOSFB-NEXT: andi a1, a1, -8
; NOSFB-NEXT: sub a0, a0, a1
; NOSFB-NEXT: ret
;
; SFB-LABEL: srem8_64:
; SFB: # %bb.0:
; SFB-NEXT: mv a1, a0
; SFB-NEXT: bgez a0, .LBB14_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a1, a0, 7
; SFB-NEXT: .LBB14_2:
; SFB-NEXT: andi a1, a1, -8
; SFB-NEXT: sub a0, a0, a1
; SFB-NEXT: ret
%res = srem i64 %0, 8
ret i64 %res
}
define i64 @sremneg8_64(i64 %0) {
; NOSFB-LABEL: sremneg8_64:
; NOSFB: # %bb.0:
; NOSFB-NEXT: srai a1, a0, 63
; NOSFB-NEXT: srli a1, a1, 61
; NOSFB-NEXT: add a1, a1, a0
; NOSFB-NEXT: andi a1, a1, -8
; NOSFB-NEXT: sub a0, a0, a1
; NOSFB-NEXT: ret
;
; SFB-LABEL: sremneg8_64:
; SFB: # %bb.0:
; SFB-NEXT: mv a1, a0
; SFB-NEXT: bgez a0, .LBB15_2
; SFB-NEXT: # %bb.1:
; SFB-NEXT: addi a1, a0, 7
; SFB-NEXT: .LBB15_2:
; SFB-NEXT: andi a1, a1, -8
; SFB-NEXT: sub a0, a0, a1
; SFB-NEXT: ret
%res = srem i64 %0, -8
ret i64 %res
}
; Negative tests
define i64 @sdiv4096(i64 %0) {
; CHECK-LABEL: sdiv4096:
; CHECK: # %bb.0:
; CHECK-NEXT: srai a1, a0, 63
; CHECK-NEXT: srli a1, a1, 52
; CHECK-NEXT: add a0, a0, a1
; CHECK-NEXT: srai a0, a0, 12
; CHECK-NEXT: ret
%res = sdiv i64 %0, 4096
ret i64 %res
}