llvm-project/llvm/test/CodeGen/RISCV/VentusGPGPU/int_arithmetic.ll

384 lines
9.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 -mcpu=ventus-gpgpu -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefix=VENTUS %s
define i32 @vdivu_v(i32 %a, i32 %b) {
; VENTUS-LABEL: vdivu_v:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vdivu.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = udiv i32 %a, %b
ret i32 %1
}
define i32 @vdivu_x(i32 %a) {
; VENTUS-LABEL: vdivu_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vdivu.vx v0, v0, a0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%udiv = udiv i32 %a, %val
ret i32 %udiv
}
define i32 @vdiv_v(i32 %a, i32 %b) {
; VENTUS-LABEL: vdiv_v:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vdiv.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = sdiv i32 %a, %b
ret i32 %1
}
define i32 @vdiv_x(i32 %a) {
; VENTUS-LABEL: vdiv_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vdiv.vx v0, v0, a0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%sdiv = sdiv i32 %a, %val
ret i32 %sdiv
}
define i32 @urem(i32 %a, i32 %b) nounwind {
; VENTUS-LABEL: urem:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vremu.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = urem i32 %a, %b
ret i32 %1
}
define i32 @urem_constant_lhs(i32 %a) nounwind {
; VENTUS-LABEL: urem_constant_lhs:
; VENTUS: # %bb.0:
; VENTUS-NEXT: li a0, 10
; VENTUS-NEXT: vmv.s.x v1, a0
; VENTUS-NEXT: vremu.vv v0, v1, v0
; VENTUS-NEXT: ret
%1 = urem i32 10, %a
ret i32 %1
}
define i32 @srem(i32 %a, i32 %b) nounwind {
; VENTUS-LABEL: srem:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vrem.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = srem i32 %a, %b
ret i32 %1
}
define i32 @srem_pow2(i32 %a) nounwind {
; VENTUS-LABEL: srem_pow2:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vsra.vi v1, v0, 31
; VENTUS-NEXT: vsrl.vi v1, v1, 29
; VENTUS-NEXT: vadd.vv v1, v0, v1
; VENTUS-NEXT: li a0, -8
; VENTUS-NEXT: vand.vx v1, v1, a0
; VENTUS-NEXT: vsub.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = srem i32 %a, 8
ret i32 %1
}
define i32 @srem_pow2_2(i32 %a) nounwind {
; VENTUS-LABEL: srem_pow2_2:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vsra.vi v1, v0, 31
; VENTUS-NEXT: vsrl.vi v1, v1, 16
; VENTUS-NEXT: vadd.vv v1, v0, v1
; VENTUS-NEXT: lui a0, 1048560
; VENTUS-NEXT: vand.vx v1, v1, a0
; VENTUS-NEXT: vsub.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = srem i32 %a, 65536
ret i32 %1
}
define i32 @srem_constant_lhs(i32 %a) nounwind {
; VENTUS-LABEL: srem_constant_lhs:
; VENTUS: # %bb.0:
; VENTUS-NEXT: li a0, -10
; VENTUS-NEXT: vmv.s.x v1, a0
; VENTUS-NEXT: vrem.vv v0, v1, v0
; VENTUS-NEXT: ret
%1 = srem i32 -10, %a
ret i32 %1
}
define i32 @vadd_v(i32 %a, i32 %b) nounwind {
; VENTUS-LABEL: vadd_v:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vadd.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = add i32 %a, %b
ret i32 %1
}
define i32 @vadd_x(i32 %a) nounwind {
; VENTUS-LABEL: vadd_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vadd.vx v0, v0, a0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%add = add i32 %a, %val
ret i32 %add
}
define i32 @vadd_i(i32 %a) nounwind {
; VENTUS-LABEL: vadd_i:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vadd.vi v0, v0, 12
; VENTUS-NEXT: ret
%1 = add i32 %a, 12
ret i32 %1
}
define i32 @vsub_v(i32 %a, i32 %b) nounwind {
; VENTUS-LABEL: vsub_v:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vsub.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = sub i32 %a, %b
ret i32 %1
}
define i32 @vsub_x(i32 %a) nounwind {
; VENTUS-LABEL: vsub_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vsub.vx v0, v0, a0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%sub = sub i32 %a, %val
ret i32 %sub
}
define i32 @vrsub_x(i32 %a) nounwind {
; VENTUS-LABEL: vrsub_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vmv.s.x v1, a0
; VENTUS-NEXT: vsub.vv v0, v1, v0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%sub = sub i32 %val, %a
ret i32 %sub
}
define i32 @vmul_v(i32 %a, i32 %b) nounwind {
; VENTUS-LABEL: vmul_v:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vmul.vv v0, v0, v1
; VENTUS-NEXT: ret
%mul = mul i32 %a, %b
ret i32 %mul
}
define i32 @vmul_x(i32 %a) nounwind {
; VENTUS-LABEL: vmul_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vmul.vx v0, v0, a0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%mul = mul i32 %a, %val
ret i32 %mul
}
define i32 @vmulh_v(i32 %a, i32 %b) nounwind {
; VENTUS-LABEL: vmulh_v:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vmulh.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = sext i32 %a to i64
%2 = sext i32 %b to i64
%3 = mul i64 %1, %2
%4 = lshr i64 %3, 32
%5 = trunc i64 %4 to i32
ret i32 %5
}
define i32 @vmulh_x(i32 %a) nounwind {
; VENTUS-LABEL: vmulh_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vmulh.vx v0, v0, a0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%1 = sext i32 %a to i64
%2 = sext i32 %val to i64
%3 = mul i64 %1, %2
%4 = lshr i64 %3, 32
%5 = trunc i64 %4 to i32
ret i32 %5
}
define i32 @vmulhu_v(i32 %a, i32 %b) nounwind {
; VENTUS-LABEL: vmulhu_v:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vmulhu.vv v0, v0, v1
; VENTUS-NEXT: ret
%1 = zext i32 %a to i64
%2 = zext i32 %b to i64
%3 = mul i64 %1, %2
%4 = lshr i64 %3, 32
%5 = trunc i64 %4 to i32
ret i32 %5
}
define i32 @vmulhu_x(i32 %a) nounwind {
; VENTUS-LABEL: vmulhu_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vmulhu.vx v0, v0, a0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%1 = zext i32 %a to i64
%2 = zext i32 %val to i64
%3 = mul i64 %1, %2
%4 = lshr i64 %3, 32
%5 = trunc i64 %4 to i32
ret i32 %5
}
define i32 @vmulhsu_v(i32 %a, i32 %b) nounwind {
; VENTUS-LABEL: vmulhsu_v:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vmulhsu.vv v0, v1, v0
; VENTUS-NEXT: ret
%1 = zext i32 %a to i64
%2 = sext i32 %b to i64
%3 = mul i64 %1, %2
%4 = lshr i64 %3, 32
%5 = trunc i64 %4 to i32
ret i32 %5
}
define i32 @vmulhsu_x(i32 %a) nounwind {
; VENTUS-LABEL: vmulhsu_x:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vmulhsu.vx v0, v0, a0
; VENTUS-NEXT: ret
%val = load i32, ptr @global_val
%1 = sext i32 %a to i64
%2 = zext i32 %val to i64
%3 = mul i64 %1, %2
%4 = lshr i64 %3, 32
%5 = trunc i64 %4 to i32
ret i32 %5
}
define i32 @vrsub_i(i32 %a) nounwind {
; VENTUS-LABEL: vrsub_i:
; VENTUS: # %bb.0:
; VENTUS-NEXT: vrsub.vi v0, v0, 12
; VENTUS-NEXT: ret
%1 = sub i32 12, %a
ret i32 %1
}
define i32 @vrsub_bigimm(i32 %a) nounwind {
; VENTUS-LABEL: vrsub_bigimm:
; VENTUS: # %bb.0:
; VENTUS-NEXT: lui a0, 16
; VENTUS-NEXT: vmv.s.x v1, a0
; VENTUS-NEXT: vsub.vv v0, v1, v0
; VENTUS-NEXT: ret
%1 = sub i32 65536, %a
ret i32 %1
}
define dso_local i32 @nmsub_v(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr {
; VENTUS-LABEL: nmsub_v:
; VENTUS: # %bb.0: # %entry
; VENTUS-NEXT: vnmsub.vv v1, v0, v2
; VENTUS-NEXT: vadd.vx v0, v1, zero
; VENTUS-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%add = sub i32 %c, %mul
ret i32 %add
}
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
define dso_local i32 @nmsub_x(i32 noundef %a, i32 noundef %b) local_unnamed_addr {
; VENTUS-LABEL: nmsub_x:
; VENTUS: # %bb.0: # %entry
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vmadd.vx v0, a0, v1
; VENTUS-NEXT: ret
entry:
%val = load i32, ptr @global_val
%mul.neg = mul i32 %a, %val
%add = add nsw i32 %mul.neg, %b
ret i32 %add
}
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
define dso_local i32 @madd_v(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr {
; VENTUS-LABEL: madd_v:
; VENTUS: # %bb.0: # %entry
; VENTUS-NEXT: vmadd.vv v1, v0, v2
; VENTUS-NEXT: vadd.vx v0, v1, zero
; VENTUS-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%add = add nsw i32 %mul, %c
ret i32 %add
}
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
define dso_local i32 @madd_x(i32 noundef %a, i32 noundef %b) local_unnamed_addr {
; VENTUS-LABEL: madd_x:
; VENTUS: # %bb.0: # %entry
; VENTUS-NEXT: lui a0, %hi(global_val)
; VENTUS-NEXT: lw a0, %lo(global_val)(a0)
; VENTUS-NEXT: vmadd.vx v0, a0, v1
; VENTUS-NEXT: ret
entry:
%val = load i32, ptr @global_val
%mul = mul nsw i32 %a, %val
%add = add nsw i32 %mul, %b
ret i32 %add
}
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
define dso_local i32 @vaddimm12(i32 noundef %a) local_unnamed_addr {
; VENTUS-LABEL: vaddimm12:
; VENTUS: # %bb.0: # %entry
; VENTUS-NEXT: vadd12.vi v0, v0, 1024
; VENTUS-NEXT: ret
entry:
%add = add nsw i32 %a, 1024
ret i32 %add
}
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
define dso_local i32 @vsubimm12(i32 noundef %a) local_unnamed_addr{
; VENTUS-LABEL: vsubimm12:
; VENTUS: # %bb.0: # %entry
; VENTUS-NEXT: vsub12.vi v0, v0, 1024
; VENTUS-NEXT: ret
entry:
%sub = sub nsw i32 %a, 1024
ret i32 %sub
}
@global_val = dso_local global i32 10, align 4