Files
clang-p2996/llvm/test/CodeGen/RISCV/rv64d-double-convert-strict.ll
Craig Topper f69078b77f [RISCV] Update some tests to use floating point ABI where it makes sense.
Trying to reduce the diffs from D118333 for cases where it makes
more sense to use an FP ABI.

Reviewed By: asb, kito-cheng

Differential Revision: https://reviews.llvm.org/D120447
2022-02-24 09:27:57 -08:00

123 lines
4.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs -target-abi=lp64d \
; RUN: -disable-strictnode-mutation < %s | FileCheck %s -check-prefix=RV64ID
; This file exhaustively checks double<->i32 conversions. In general,
; fcvt.l[u].d can be selected instead of fcvt.w[u].d because poison is
; generated for an fpto[s|u]i conversion if the result doesn't fit in the
; target type.
define i32 @aext_fptosi(double %a) nounwind strictfp {
; RV64ID-LABEL: aext_fptosi:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.w.d a0, fa0, rtz
; RV64ID-NEXT: ret
%1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.strict") strictfp
ret i32 %1
}
declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)
define signext i32 @sext_fptosi(double %a) nounwind strictfp {
; RV64ID-LABEL: sext_fptosi:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.w.d a0, fa0, rtz
; RV64ID-NEXT: ret
%1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.strict") strictfp
ret i32 %1
}
define zeroext i32 @zext_fptosi(double %a) nounwind strictfp {
; RV64ID-LABEL: zext_fptosi:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.w.d a0, fa0, rtz
; RV64ID-NEXT: slli a0, a0, 32
; RV64ID-NEXT: srli a0, a0, 32
; RV64ID-NEXT: ret
%1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.strict") strictfp
ret i32 %1
}
define i32 @aext_fptoui(double %a) nounwind strictfp {
; RV64ID-LABEL: aext_fptoui:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.wu.d a0, fa0, rtz
; RV64ID-NEXT: ret
%1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.strict") strictfp
ret i32 %1
}
declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)
define signext i32 @sext_fptoui(double %a) nounwind strictfp {
; RV64ID-LABEL: sext_fptoui:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.wu.d a0, fa0, rtz
; RV64ID-NEXT: ret
%1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.strict") strictfp
ret i32 %1
}
define zeroext i32 @zext_fptoui(double %a) nounwind strictfp {
; RV64ID-LABEL: zext_fptoui:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.lu.d a0, fa0, rtz
; RV64ID-NEXT: ret
%1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.strict") strictfp
ret i32 %1
}
define double @uitofp_aext_i32_to_f64(i32 %a) nounwind strictfp {
; RV64ID-LABEL: uitofp_aext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.wu fa0, a0
; RV64ID-NEXT: ret
%1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
ret double %1
}
declare double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata, metadata)
define double @uitofp_sext_i32_to_f64(i32 signext %a) nounwind strictfp {
; RV64ID-LABEL: uitofp_sext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.wu fa0, a0
; RV64ID-NEXT: ret
%1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
ret double %1
}
define double @uitofp_zext_i32_to_f64(i32 zeroext %a) nounwind strictfp {
; RV64ID-LABEL: uitofp_zext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.wu fa0, a0
; RV64ID-NEXT: ret
%1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
ret double %1
}
define double @sitofp_aext_i32_to_f64(i32 %a) nounwind strictfp {
; RV64ID-LABEL: sitofp_aext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.w fa0, a0
; RV64ID-NEXT: ret
%1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
ret double %1
}
declare double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata, metadata)
define double @sitofp_sext_i32_to_f64(i32 signext %a) nounwind strictfp {
; RV64ID-LABEL: sitofp_sext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.w fa0, a0
; RV64ID-NEXT: ret
%1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
ret double %1
}
define double @sitofp_zext_i32_to_f64(i32 zeroext %a) nounwind strictfp {
; RV64ID-LABEL: sitofp_zext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.w fa0, a0
; RV64ID-NEXT: ret
%1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
ret double %1
}