11module Quadmath
22using Requires
3+ using Compat: @assume_effects
34
45export Float128, ComplexF128, Inf128
56
@@ -128,32 +129,32 @@ fpinttype(::Type{Float128}) = UInt128
128129Float128 (x:: Float128 ) = x
129130
130131# Float64
131- Float128 (x:: Float64 ) =
132+ @assume_effects :foldable Float128 (x:: Float64 ) =
132133 Float128 (@ccall (quadoplib. __extenddftf2 (x:: Cdouble ):: Cfloat128 ))
133- Float64 (x:: Float128 ) =
134+ @assume_effects :foldable Float64 (x:: Float128 ) =
134135 @ccall (quadoplib. __trunctfdf2 (x:: Cfloat128 ):: Cdouble )
135136
136137# Float32
137- Float128 (x:: Float32 ) =
138+ @assume_effects :foldable Float128 (x:: Float32 ) =
138139 Float128 (@ccall (quadoplib. __extendsftf2 (x:: Cfloat ):: Cfloat128 ))
139- Float32 (x:: Float128 ) =
140+ @assume_effects :foldable Float32 (x:: Float128 ) =
140141 @ccall (quadoplib. __trunctfsf2 (x:: Cfloat128 ):: Cfloat )
141142
142143# Float16
143144Float128 (x:: Float16 ) = Float128 (Float32 (x))
144- Float16 (x:: Float128 ) = Float16 (Float32 (x)) # TODO : avoid double rounding
145+ Float16 (x:: Float128 ) = Float16 (Float64 (x)) # TODO : avoid double rounding
145146
146147# integer -> Float128
147- Float128 (x:: Int32 ) =
148+ @assume_effects :foldable Float128 (x:: Int32 ) =
148149 Float128 (@ccall (quadoplib. __floatsitf (x:: Int32 ):: Cfloat128 ))
149150
150- Float128 (x:: UInt32 ) =
151+ @assume_effects :foldable Float128 (x:: UInt32 ) =
151152 Float128 (@ccall (quadoplib. __floatunsitf (x:: UInt32 ):: Cfloat128 ))
152153
153- Float128 (x:: Int64 ) =
154+ @assume_effects :foldable Float128 (x:: Int64 ) =
154155 Float128 (@ccall (quadoplib. __floatditf (x:: Int64 ):: Cfloat128 ))
155156
156- Float128 (x:: UInt64 ) =
157+ @assume_effects :foldable Float128 (x:: UInt64 ) =
157158 Float128 (@ccall (quadoplib. __floatunditf (x:: UInt64 ):: Cfloat128 ))
158159
159160Float128 (x:: Int16 ) = Float128 (Int32 (x))
@@ -215,37 +216,37 @@ Float128(x::Rational{T}) where T = Float128(numerator(x))/Float128(denominator(x
215216Float128 (x:: Bool ) = x ? Float128 (1 ) : Float128 (0 )
216217
217218# Comparison
218- (== )(x:: Float128 , y:: Float128 ) =
219+ @assume_effects :foldable (== )(x:: Float128 , y:: Float128 ) =
219220 @ccall (quadoplib. __eqtf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) == 0
220- (< )(x:: Float128 , y:: Float128 ) =
221+ @assume_effects :foldable (< )(x:: Float128 , y:: Float128 ) =
221222 @ccall (quadoplib. __letf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) == - 1
222- (<= )(x:: Float128 , y:: Float128 ) =
223+ @assume_effects :foldable (<= )(x:: Float128 , y:: Float128 ) =
223224 @ccall (quadoplib. __letf2 (x:: Cfloat128 , y:: Cfloat128 ):: Cint ) <= 0
224225
225226# Arithmetic
226- (+ )(x:: Float128 , y:: Float128 ) =
227+ @assume_effects :foldable (+ )(x:: Float128 , y:: Float128 ) =
227228 Float128 (@ccall (quadoplib. __addtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
228- (- )(x:: Float128 , y:: Float128 ) =
229+ @assume_effects :foldable (- )(x:: Float128 , y:: Float128 ) =
229230 Float128 (@ccall (quadoplib. __subtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
230- (* )(x:: Float128 , y:: Float128 ) =
231+ @assume_effects :foldable (* )(x:: Float128 , y:: Float128 ) =
231232 Float128 (@ccall (quadoplib. __multf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
232- (/ )(x:: Float128 , y:: Float128 ) =
233+ @assume_effects :foldable (/ )(x:: Float128 , y:: Float128 ) =
233234 Float128 (@ccall (quadoplib. __divtf3 (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
234235
235- (- )(x:: Float128 ) =
236+ @assume_effects :foldable (- )(x:: Float128 ) =
236237 Float128 (@ccall (quadoplib. __negtf2 (x:: Cfloat128 ):: Cfloat128 ))
237238
238239# Float128 -> Integer
239- unsafe_trunc (:: Type{Int32} , x:: Float128 ) =
240+ @assume_effects :foldable unsafe_trunc (:: Type{Int32} , x:: Float128 ) =
240241 @ccall (quadoplib. __fixtfsi (x:: Cfloat128 ):: Int32 )
241242
242- unsafe_trunc (:: Type{Int64} , x:: Float128 ) =
243+ @assume_effects :foldable unsafe_trunc (:: Type{Int64} , x:: Float128 ) =
243244 @ccall (quadoplib. __fixtfdi (x:: Cfloat128 ):: Int64 )
244245
245- unsafe_trunc (:: Type{UInt32} , x:: Float128 ) =
246+ @assume_effects :foldable unsafe_trunc (:: Type{UInt32} , x:: Float128 ) =
246247 @ccall (quadoplib. __fixunstfsi (x:: Cfloat128 ):: UInt32 )
247248
248- unsafe_trunc (:: Type{UInt64} , x:: Float128 ) =
249+ @assume_effects :foldable unsafe_trunc (:: Type{UInt64} , x:: Float128 ) =
249250 @ccall (quadoplib. __fixunstfdi (x:: Cfloat128 ):: UInt64 )
250251
251252function unsafe_trunc (:: Type{UInt128} , x:: Float128 )
@@ -317,19 +318,19 @@ for f in (:acos, :acosh, :asin, :asinh, :atan, :atanh, :cosh, :cos,
317318 :exp , :expm1 , :log , :log2 , :log10 , :log1p ,
318319 :sin , :sinh , :sqrt , :tan , :tanh ,
319320 :ceil , :floor , :trunc , )
320- @eval function $f (x:: Float128 )
321+ @eval @assume_effects :foldable function $f (x:: Float128 )
321322 Float128 (@ccall (libquadmath.$ (string (f,:q ))(x:: Cfloat128 ):: Cfloat128 ))
322323 end
323324end
324325
325- abs (x:: Float128 ) = Float128 (@ccall (libquadmath. fabsq (x:: Cfloat128 ):: Cfloat128 ))
326- round (x:: Float128 ) = Float128 (@ccall (libquadmath. rintq (x:: Cfloat128 ):: Cfloat128 ))
326+ @assume_effects :foldable abs (x:: Float128 ) = Float128 (@ccall (libquadmath. fabsq (x:: Cfloat128 ):: Cfloat128 ))
327+ @assume_effects :foldable round (x:: Float128 ) = Float128 (@ccall (libquadmath. rintq (x:: Cfloat128 ):: Cfloat128 ))
327328round (x:: Float128 , r:: RoundingMode{:Down} ) = floor (x)
328329round (x:: Float128 , r:: RoundingMode{:Up} ) = ceil (x)
329330round (x:: Float128 , r:: RoundingMode{:ToZero} ) = round (x)
330331
331332# # two argument
332- (^ )(x:: Float128 , y:: Float128 ) =
333+ @assume_effects :foldable (^ )(x:: Float128 , y:: Float128 ) =
333334 Float128 (@ccall (libquadmath. powq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
334335
335336# circumvent a failure in Base
@@ -340,25 +341,25 @@ function (^)(x::Float128, p::Integer)
340341 Base. power_by_squaring (inv (x),- p)
341342 end
342343end
343- copysign (x:: Float128 , y:: Float128 ) =
344+ @assume_effects :foldable copysign (x:: Float128 , y:: Float128 ) =
344345 Float128 (@ccall (libquadmath. copysignq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
345- hypot (x:: Float128 , y:: Float128 ) =
346+ @assume_effects :foldable hypot (x:: Float128 , y:: Float128 ) =
346347 Float128 (@ccall (libquadmath. hypotq (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
347- atan (x:: Float128 , y:: Float128 ) =
348+ @assume_effects :foldable atan (x:: Float128 , y:: Float128 ) =
348349 Float128 (@ccall (libquadmath. atan2q (x:: Cfloat128 , y:: Cfloat128 ):: Cfloat128 ))
349350sincos (x:: Float128 ) = (sin (x), cos (x))
350351
351352# # misc
352353@static if ! Sys. iswindows ()
353354 # disable fma on Windows until rounding mode issue fixed
354355 # https://github.com/JuliaMath/Quadmath.jl/issues/31
355- fma (x:: Float128 , y:: Float128 , z:: Float128 ) =
356+ @assume_effects :foldable fma (x:: Float128 , y:: Float128 , z:: Float128 ) =
356357 Float128 (@ccall (libquadmath. fmaq (x:: Cfloat128 , y:: Cfloat128 , z:: Cfloat128 ):: Cfloat128 ))
357358end
358359
359- isnan (x:: Float128 ) = 0 != @ccall (libquadmath. isnanq (x:: Cfloat128 ):: Cint )
360- isinf (x:: Float128 ) = 0 != @ccall (libquadmath. isinfq (x:: Cfloat128 ):: Cint )
361- isfinite (x:: Float128 ) = 0 != @ccall (libquadmath. finiteq (x:: Cfloat128 ):: Cint )
360+ @assume_effects :foldable isnan (x:: Float128 ) = 0 != @ccall (libquadmath. isnanq (x:: Cfloat128 ):: Cint )
361+ @assume_effects :foldable isinf (x:: Float128 ) = 0 != @ccall (libquadmath. isinfq (x:: Cfloat128 ):: Cint )
362+ @assume_effects :foldable isfinite (x:: Float128 ) = 0 != @ccall (libquadmath. finiteq (x:: Cfloat128 ):: Cint )
362363
363364isinteger (x:: Float128 ) = isfinite (x) && x === trunc (x)
364365
@@ -382,13 +383,13 @@ const Inf128 = reinterpret(Float128, 0x7fff_0000_0000_0000_0000_0000_0000_0000)
382383typemax (:: Type{Float128} ) = Inf128
383384typemin (:: Type{Float128} ) = - Inf128
384385
385- ldexp (x:: Float128 , n:: Cint ) =
386+ @assume_effects :foldable ldexp (x:: Float128 , n:: Cint ) =
386387 Float128 (@ccall (libquadmath. ldexpq (x:: Cfloat128 , n:: Cint ):: Cfloat128 ))
387388ldexp (x:: Float128 , n:: Integer ) =
388389 ldexp (x, clamp (n, typemin (Cint), typemax (Cint)) % Cint)
389390
390391
391- function frexp (x:: Float128 )
392+ @assume_effects :foldable function frexp (x:: Float128 )
392393 ri = Ref {Cint} ()
393394 f = Float128 (@ccall (libquadmath. frexpq (x:: Cfloat128 , ri:: Ptr{Cint} ):: Cfloat128 ))
394395 return f, Int (ri[])
0 commit comments