mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-07 19:47:53 +00:00
7777a204e2
The C standard has historically not specified whether or not these functions should raise the inexact flag. Traditionally on Darwin, these functions *did* raise inexact, and the llvm lowerings followed that conventions. n1778 (C bindings for IEEE-754 (2008)) clarifies that these functions should not set inexact. This patch brings the lowerings for arm64 and x86 in line with the newly specified behavior. This also lets us fold some logic into TD patterns, which is nice. Differential Revision: http://reviews.llvm.org/D12969 llvm-svn: 248266
205 lines
4.3 KiB
LLVM
205 lines
4.3 KiB
LLVM
; RUN: llc -O3 < %s -mtriple=arm64 | FileCheck %s
|
|
|
|
; CHECK-LABEL: test1:
|
|
; CHECK: frintm
|
|
; CHECK-NOT: frintx
|
|
define float @test1(float %a) #0 {
|
|
entry:
|
|
%call = tail call float @floorf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
declare float @floorf(float) nounwind readnone
|
|
|
|
; CHECK-LABEL: test2:
|
|
; CHECK: frintm
|
|
; CHECK-NOT: frintx
|
|
define double @test2(double %a) #0 {
|
|
entry:
|
|
%call = tail call double @floor(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
declare double @floor(double) nounwind readnone
|
|
|
|
; CHECK-LABEL: test3:
|
|
; CHECK: frinti
|
|
define float @test3(float %a) #0 {
|
|
entry:
|
|
%call = tail call float @nearbyintf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
declare float @nearbyintf(float) nounwind readnone
|
|
|
|
; CHECK-LABEL: test4:
|
|
; CHECK: frinti
|
|
define double @test4(double %a) #0 {
|
|
entry:
|
|
%call = tail call double @nearbyint(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
declare double @nearbyint(double) nounwind readnone
|
|
|
|
; CHECK-LABEL: test5:
|
|
; CHECK: frintp
|
|
; CHECK-NOT: frintx
|
|
define float @test5(float %a) #0 {
|
|
entry:
|
|
%call = tail call float @ceilf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
declare float @ceilf(float) nounwind readnone
|
|
|
|
; CHECK-LABEL: test6:
|
|
; CHECK: frintp
|
|
; CHECK-NOT: frintx
|
|
define double @test6(double %a) #0 {
|
|
entry:
|
|
%call = tail call double @ceil(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
declare double @ceil(double) nounwind readnone
|
|
|
|
; CHECK-LABEL: test7:
|
|
; CHECK: frintx
|
|
define float @test7(float %a) #0 {
|
|
entry:
|
|
%call = tail call float @rintf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
declare float @rintf(float) nounwind readnone
|
|
|
|
; CHECK-LABEL: test8:
|
|
; CHECK: frintx
|
|
define double @test8(double %a) #0 {
|
|
entry:
|
|
%call = tail call double @rint(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
declare double @rint(double) nounwind readnone
|
|
|
|
; CHECK-LABEL: test9:
|
|
; CHECK: frintz
|
|
; CHECK-NOT: frintx
|
|
define float @test9(float %a) #0 {
|
|
entry:
|
|
%call = tail call float @truncf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
declare float @truncf(float) nounwind readnone
|
|
|
|
; CHECK-LABEL: test10:
|
|
; CHECK: frintz
|
|
; CHECK-NOT: frintx
|
|
define double @test10(double %a) #0 {
|
|
entry:
|
|
%call = tail call double @trunc(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
declare double @trunc(double) nounwind readnone
|
|
|
|
; CHECK-LABEL: test11:
|
|
; CHECK: frinta
|
|
; CHECK-NOT: frintx
|
|
define float @test11(float %a) #0 {
|
|
entry:
|
|
%call = tail call float @roundf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
declare float @roundf(float %a) nounwind readnone
|
|
|
|
; CHECK-LABEL: test12:
|
|
; CHECK: frinta
|
|
; CHECK-NOT: frintx
|
|
define double @test12(double %a) #0 {
|
|
entry:
|
|
%call = tail call double @round(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
declare double @round(double %a) nounwind readnone
|
|
|
|
; CHECK-LABEL: test13:
|
|
; CHECK-NOT: frintx
|
|
; CHECK: frintm
|
|
define float @test13(float %a) #1 {
|
|
entry:
|
|
%call = tail call float @floorf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
; CHECK-LABEL: test14:
|
|
; CHECK-NOT: frintx
|
|
; CHECK: frintm
|
|
define double @test14(double %a) #1 {
|
|
entry:
|
|
%call = tail call double @floor(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
; CHECK-LABEL: test15:
|
|
; CHECK-NOT: frintx
|
|
; CHECK: frintp
|
|
define float @test15(float %a) #1 {
|
|
entry:
|
|
%call = tail call float @ceilf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
; CHECK-LABEL: test16:
|
|
; CHECK-NOT: frintx
|
|
; CHECK: frintp
|
|
define double @test16(double %a) #1 {
|
|
entry:
|
|
%call = tail call double @ceil(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
; CHECK-LABEL: test17:
|
|
; CHECK-NOT: frintx
|
|
; CHECK: frintz
|
|
define float @test17(float %a) #1 {
|
|
entry:
|
|
%call = tail call float @truncf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
; CHECK-LABEL: test18:
|
|
; CHECK-NOT: frintx
|
|
; CHECK: frintz
|
|
define double @test18(double %a) #1 {
|
|
entry:
|
|
%call = tail call double @trunc(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
; CHECK-LABEL: test19:
|
|
; CHECK-NOT: frintx
|
|
; CHECK: frinta
|
|
define float @test19(float %a) #1 {
|
|
entry:
|
|
%call = tail call float @roundf(float %a) nounwind readnone
|
|
ret float %call
|
|
}
|
|
|
|
; CHECK-LABEL: test20:
|
|
; CHECK-NOT: frintx
|
|
; CHECK: frinta
|
|
define double @test20(double %a) #1 {
|
|
entry:
|
|
%call = tail call double @round(double %a) nounwind readnone
|
|
ret double %call
|
|
}
|
|
|
|
attributes #0 = { nounwind }
|
|
attributes #1 = { nounwind "unsafe-fp-math"="true" }
|