@@ -911,29 +911,35 @@ end
911
911
z
912
912
end
913
913
@inline function ^ (x:: Float32 , y:: Float32 )
914
- z = ccall (" llvm.pow.f32" , llvmcall, Float32, (Float32, Float32), x, y)
914
+ z = Float32 (exp2_fast (log2 (Float64 (x))* y))
915
+ if isnan (z) & ! isnan (x+ y)
916
+ throw_exp_domainerror (x)
917
+ end
918
+ z
919
+ end
920
+ @inline function ^ (x:: Float16 , y:: Float16 )
921
+ z = Float16 (exp2_fast (log2 (Float32 (x))* y))
915
922
if isnan (z) & ! isnan (x+ y)
916
923
throw_exp_domainerror (x)
917
924
end
918
925
z
919
926
end
920
- @inline ^ (x:: Float16 , y:: Float16 ) = Float16 (Float32 (x)^ Float32 (y)) # TODO : optimize
921
927
922
928
@inline function ^ (x:: Float64 , y:: Integer )
923
929
y == - 1 && return inv (x)
924
930
y == 0 && return one (x)
925
931
y == 1 && return x
926
932
y == 2 && return x* x
927
933
y == 3 && return x* x* x
928
- ccall ( " llvm.pow.f64 " , llvmcall, Float64, (Float64, Float64), x, Float64 (y) )
934
+ return x ^ Float64 (y)
929
935
end
930
936
@inline function ^ (x:: Float32 , y:: Integer )
931
937
y == - 1 && return inv (x)
932
938
y == 0 && return one (x)
933
939
y == 1 && return x
934
940
y == 2 && return x* x
935
941
y == 3 && return x* x* x
936
- ccall ( " llvm.pow.f32 " , llvmcall, Float32, (Float32, Float32), x, Float32 (y) )
942
+ x ^ Float32 (y)
937
943
end
938
944
@inline ^ (x:: Float16 , y:: Integer ) = Float16 (Float32 (x) ^ y)
939
945
@inline literal_pow (:: typeof (^ ), x:: Float16 , :: Val{p} ) where {p} = Float16 (literal_pow (^ ,Float32 (x),Val (p)))
0 commit comments