|
2 | 2 |
|
3 | 3 | using Base: FastMath |
4 | 4 | using Base.Math: throw_complex_domainerror |
| 5 | +import Core: Float16, Float32 |
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 |
|
11 | 12 | ### Constants |
12 | | -# π |
13 | | -const M_PI_F = Float32(reinterpret(Float64, 0x400921FB60000000)) |
14 | | -const M_PI_H = reinterpret(Float16, 0x4248) |
15 | | -@eval begin |
16 | | - @device_override Core.Float32(::typeof(π), ::RoundingMode) = $M_PI_F |
17 | | - @device_override Core.Float32(::typeof(π), ::RoundingMode{:Down}) = $(prevfloat(M_PI_F)) |
18 | | - @device_override Core.Float16(::typeof(π), ::RoundingMode{:Up}) = $(nextfloat(M_PI_H)) |
19 | | - @device_override Core.Float16(::typeof(π), ::RoundingMode) = $M_PI_H |
20 | | -end |
21 | | - |
22 | | -# ℯ |
23 | | -const M_E_F = Float32(reinterpret(Float64, 0x4005BF0A80000000)) |
24 | | -const M_E_H = reinterpret(Float16, 0x4170) |
25 | | -@eval begin |
26 | | - @device_override Core.Float32(::typeof(ℯ), ::RoundingMode{:Up}) = $(nextfloat(M_E_F)) |
27 | | - @device_override Core.Float32(::typeof(ℯ), ::RoundingMode) = $M_E_F |
28 | | - @device_override Core.Float16(::typeof(ℯ), ::RoundingMode) = $M_E_H |
29 | | - @device_override Core.Float16(::typeof(ℯ), ::RoundingMode{:Down}) = $(prevfloat(M_E_H)) |
| 13 | +# π and ℯ |
| 14 | +for T in (:Float16,:Float32), R in (RoundUp, RoundDown), irr in (π, ℯ) |
| 15 | + @eval @device_override $T(::typeof($irr), ::typeof($R)) = $@eval($T($irr,$R)) |
30 | 16 | end |
31 | 17 |
|
32 | 18 | ### Common Intrinsics |
|
0 commit comments