|
2 | 2 |
|
3 | 3 | using Base: FastMath |
4 | 4 | using Base.Math: throw_complex_domainerror |
| 5 | +import Core: Float32, Float16 |
5 | 6 |
|
6 | 7 | # TODO: |
7 | 8 | # - wrap all intrinsics from include/metal/metal_math |
8 | 9 | # - add support for vector types |
9 | 10 | # - consider emitting LLVM intrinsics and lowering those in the back-end |
10 | 11 |
|
| 12 | +# Precompute irrationals for use on GPU |
| 13 | +# macro _const_convert(irr,T,r) |
| 14 | +# :($T($irr, $r)) |
| 15 | +# end |
| 16 | +for T in (:Float32, :Float16), irr in (:π, :ℯ), r in (:RoundUp, :RoundDown) |
| 17 | + # newT = Symbol(:new,T) |
| 18 | + @eval begin |
| 19 | + # $newT(::typeof($irr), ::typeof($r)) = @_const_convert($irr, $T, $r) |
| 20 | + # @device_override $T(::typeof($irr), ::typeof($r)) = @_const_convert($irr, $T, $r) |
| 21 | + @device_override $T(::typeof($irr), ::typeof($r)) = Base.Rounding._convert_rounding($T, $irr, $r) |
| 22 | + end |
| 23 | +end |
| 24 | + |
| 25 | +for T in (:Float32, :Float16), irr in (:π, :ℯ), r in (:RoundUp, :RoundDown) |
| 26 | + @eval begin |
| 27 | + @device_override $T(::typeof($irr), ::typeof($r)) = Base.Rounding._convert_rounding($T, $irr, $r) |
| 28 | + end |
| 29 | +end |
| 30 | + |
11 | 31 | ### Constants |
12 | 32 | # π |
13 | | -@device_override Core.Float32(::typeof(π), ::RoundingMode) = reinterpret(Float32, 0x40490fdb) # 3.1415927f0 reinterpret(UInt32,Float32(reinterpret(Float64,0x400921FB60000000))) |
14 | | -@device_override Core.Float32(::typeof(π), ::RoundingMode{:Down}) = reinterpret(Float32, 0x40490fda) # 3.1415925f0 prevfloat(reinterpret(UInt32,Float32(reinterpret(Float64,0x400921FB60000000)))) |
15 | | -@device_override Core.Float16(::typeof(π), ::RoundingMode{:Up}) = reinterpret(Float16, 0x4249) # Float16(3.143) |
16 | | -@device_override Core.Float16(::typeof(π), ::RoundingMode) = reinterpret(Float16, 0x4248) # Float16(3.14) |
| 33 | +# @device_override Core.Float32(::typeof(π), ::RoundingMode) = reinterpret(Float32, 0x40490fdb) # 3.1415927f0 reinterpret(UInt32,Float32(reinterpret(Float64,0x400921FB60000000))) |
| 34 | +# @device_override Core.Float32(::typeof(π), ::RoundingMode{:Down}) = reinterpret(Float32, 0x40490fda) # 3.1415925f0 prevfloat(reinterpret(UInt32,Float32(reinterpret(Float64,0x400921FB60000000)))) |
| 35 | + |
| 36 | +# @device_override Core.Float16(::typeof(π), ::RoundingMode{:Up}) = reinterpret(Float16, 0x4249) # Float16(3.143) |
| 37 | +# @device_override Core.Float16(::typeof(π), ::RoundingMode) = reinterpret(Float16, 0x4248) # Float16(3.14) |
17 | 38 |
|
18 | 39 | # ℯ |
19 | | -@device_override Core.Float32(::typeof(ℯ), ::RoundingMode{:Up}) = reinterpret(Float32, 0x402df855) # 2.718282f0 nextfloat(reinterpret(UInt32,Float32(reinterpret(Float64,0x4005BF0A80000000)))) |
20 | | -@device_override Core.Float32(::typeof(ℯ), ::RoundingMode) = reinterpret(Float32, 0x402df854) # 2.7182817f0 reinterpret(UInt32,Float32(reinterpret(Float64,0x4005BF0A80000000))) |
21 | | -@device_override Core.Float16(::typeof(ℯ), ::RoundingMode) = reinterpret(Float16, 0x4170) # Float16(2.719) |
22 | | -@device_override Core.Float16(::typeof(ℯ), ::RoundingMode{:Down}) = reinterpret(Float16, 0x416f) # Float16(2.717) |
| 40 | +# @device_override Core.Float32(::typeof(ℯ), ::RoundingMode{:Up}) = reinterpret(Float32, 0x402df855) # 2.718282f0 nextfloat(reinterpret(UInt32,Float32(reinterpret(Float64,0x4005BF0A80000000)))) |
| 41 | +# @device_override Core.Float32(::typeof(ℯ), ::RoundingMode) = reinterpret(Float32, 0x402df854) # 2.7182817f0 reinterpret(UInt32,Float32(reinterpret(Float64,0x4005BF0A80000000))) |
| 42 | +# @device_override Core.Float16(::typeof(ℯ), ::RoundingMode) = reinterpret(Float16, 0x4170) # Float16(2.719) |
| 43 | +# @device_override Core.Float16(::typeof(ℯ), ::RoundingMode{:Down}) = reinterpret(Float16, 0x416f) # Float16(2.717) |
23 | 44 |
|
24 | 45 | ### Common Intrinsics |
25 | 46 | @device_function clamp_fast(x::Float32, minval::Float32, maxval::Float32) = ccall("extern air.fast_clamp.f32", llvmcall, Cfloat, (Cfloat, Cfloat, Cfloat), x, minval, maxval) |
|
0 commit comments