Skip to content

Commit c057d95

Browse files
authored
Merge pull request #56 from JuliaMath/assume-foldable
@assume_effects :foldable for all the ccalls
2 parents be88e47 + bfb7a94 commit c057d95

File tree

3 files changed

+38
-37
lines changed

3 files changed

+38
-37
lines changed

.github/workflows/CI.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ jobs:
1313
fail-fast: false
1414
matrix:
1515
version:
16-
- '1.0'
17-
- '1.5'
1816
- '1.6'
17+
- '1.8'
1918
- 'nightly'
2019
os:
2120
- ubuntu-latest

Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ uuid = "be4d8f0f-7fa4-5f49-b795-2f01399ab2dd"
33
version = "0.5.6"
44

55
[deps]
6+
Compat = "34da2185-b29b-5c13-b0c7-acf172513d20"
67
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
78
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
89
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
910

1011
[compat]
1112
Requires = "1.0"
12-
julia = "1.0"
13+
julia = "1.6"
1314

1415
[extras]
1516
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"

src/Quadmath.jl

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module Quadmath
22
using Requires
3+
using Compat: @assume_effects
34

45
export Float128, ComplexF128, Inf128
56

@@ -128,32 +129,32 @@ fpinttype(::Type{Float128}) = UInt128
128129
Float128(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
143144
Float128(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

159160
Float128(x::Int16) = Float128(Int32(x))
@@ -215,37 +216,37 @@ Float128(x::Rational{T}) where T = Float128(numerator(x))/Float128(denominator(x
215216
Float128(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

251252
function 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
323324
end
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))
327328
round(x::Float128, r::RoundingMode{:Down}) = floor(x)
328329
round(x::Float128, r::RoundingMode{:Up}) = ceil(x)
329330
round(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
342343
end
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))
349350
sincos(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))
357358
end
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

363364
isinteger(x::Float128) = isfinite(x) && x === trunc(x)
364365

@@ -382,13 +383,13 @@ const Inf128 = reinterpret(Float128, 0x7fff_0000_0000_0000_0000_0000_0000_0000)
382383
typemax(::Type{Float128}) = Inf128
383384
typemin(::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))
387388
ldexp(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

Comments
 (0)