Skip to content

Instantly share code, notes, and snippets.

@simonbyrne
Created October 21, 2017 21:17
Show Gist options
  • Save simonbyrne/986a87a595a99a48e33ac51d7e4f21a7 to your computer and use it in GitHub Desktop.
Save simonbyrne/986a87a595a99a48e33ac51d7e4f21a7 to your computer and use it in GitHub Desktop.
module Intrinsics
tname(::Type{Float64}) = "double"
tname(::Type{Float32}) = "float"
fname(::Type{Float64}) = "f64"
fname(::Type{Float32}) = "f32"
for f in [:add, :sub, :mul, :div, :rem]
@eval function $f(x::T, y::T) where {T<:Union{Float32, Float64}}
ff = $f
Base.llvmcall((
"""
declare $(tname(T)) @llvm.experimental.constrained.f$ff.$(fname(T))($(tname(T)), $(tname(T)), metadata, metadata)
""",
"""
%res = call $(tname(T)) @llvm.experimental.constrained.f$ff.$(fname(T))(
$(tname(T)) %0,
$(tname(T)) %1,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
ret $(tname(T)) %res
"""),
T, Tuple{T,T}, x,y)
end
end
function fma(x::T, y::T, z::T) where {T<:Union{Float32, Float64}}
Base.llvmcall((
"""
declare $(tname(T)) @llvm.experimental.constrained.fma.$(fname(T))($(tname(T)), $(tname(T)), $(tname(T)), metadata, metadata)
""",
"""
%res = call $(tname(T)) @llvm.experimental.constrained.fma.$(fname(T))(
$(tname(T)) %0,
$(tname(T)) %1,
$(tname(T)) %2,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
ret $(tname(T)) %res
"""),
T, Tuple{T,T,T}, x,y,z)
end
function sqrt(x::T) where {T<:Union{Float32,Float64}}
Base.llvmcall((
"""
declare $(tname(T)) @llvm.experimental.constrained.sqrt.$(fname(T))($(tname(T)), $(tname(T)), metadata, metadata)
""",
"""
%res = call $(tname(T)) @llvm.experimental.constrained.sqrt.$(fname(T))(
$(tname(T)) %0,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
ret $(tname(T)) %res
"""),
T, Tuple{T}, x)
end
end # module
Intrinsics.add(1.0,2.0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment