mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
db12ebf176
Some of our conversion algorithms produce -0.0 when converting unsigned i64 to double when the rounding mode is round toward negative. This switches them to other algorithms that don't have this problem. Since it is undefined behavior to change rounding mode with the non-strict nodes, this patch only changes the behavior for strict nodes. There are still problems with unsigned i32 conversions too which I'll try to fix in another patch. Fixes part of PR47393 Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D87115
48 lines
1.7 KiB
LLVM
48 lines
1.7 KiB
LLVM
; Test strict conversions of unsigned i64s to floating-point values (z10 only).
|
|
;
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
|
|
|
declare float @llvm.experimental.constrained.uitofp.f32.i64(i64, metadata, metadata)
|
|
declare double @llvm.experimental.constrained.uitofp.f64.i64(i64, metadata, metadata)
|
|
declare fp128 @llvm.experimental.constrained.uitofp.f128.i64(i64, metadata, metadata)
|
|
|
|
; Test i64->f32. There's no native support for unsigned i64-to-fp conversions,
|
|
; but we should be able to implement them using signed i64-to-fp conversions.
|
|
define float @f1(i64 %i) #0 {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: cegbr
|
|
; CHECK: aebr
|
|
; CHECK: br %r14
|
|
%conv = call float @llvm.experimental.constrained.uitofp.f32.i64(i64 %i,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #0
|
|
ret float %conv
|
|
}
|
|
|
|
; Test i64->f64.
|
|
define double @f2(i64 %i) #0 {
|
|
; CHECK-LABEL: f2:
|
|
; CHECK: cdgbr
|
|
; CHECK: adbr
|
|
; CHECK: br %r14
|
|
%conv = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 %i,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #0
|
|
ret double %conv
|
|
}
|
|
|
|
; Test i64->f128.
|
|
define void @f3(i64 %i, fp128 *%dst) #0 {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: cxgbr
|
|
; CHECK: axbr
|
|
; CHECK: br %r14
|
|
%conv = call fp128 @llvm.experimental.constrained.uitofp.f128.i64(i64 %i,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #0
|
|
store fp128 %conv, fp128 *%dst
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { strictfp }
|