384 lines
9.7 KiB
LLVM
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
|