12
12
using LLVM
13
13
using LLVM. Interop
14
14
15
- # TODO : select the right intrinsic overload (https://github.com/maleadt/LLVM.jl/issues/112)
16
- suffix (:: Type{Float64} ) = " f64"
17
- suffix (:: Type{Float32} ) = " f32"
18
-
19
15
# map Julia functions to llvm intrinsic
20
16
func (:: Type{typeof(+)} ) = " fadd"
21
17
@@ -45,15 +41,14 @@ meta(::Type{FPExceptStrict}) = "fpexcept.strict"
45
41
mround = MDString (meta (round); ctx)
46
42
mfpexcept = MDString (meta (fpexcept); ctx)
47
43
mod = LLVM. parent (llvm_f)
48
- intrinsic_typ = LLVM. FunctionType (typ, [paramtyps... , mtyp, mtyp])
49
- intrinsic = LLVM. Function (mod, " llvm.experimental.constrained.$(func (F)) .$(suffix (T)) " ,
50
- intrinsic_typ)
44
+ intrinsic = Intrinsic (" llvm.experimental.constrained.$(func (F)) " )
45
+ intrinsic_fun = LLVM. Function (mod, intrinsic, [typ])
51
46
52
47
# generate IR
53
48
@dispose builder= Builder (ctx) begin
54
49
entry = BasicBlock (llvm_f, " entry" ; ctx)
55
50
position! (builder, entry)
56
- val = call! (builder, intrinsic ,
51
+ val = call! (builder, intrinsic_fun ,
57
52
[parameters (llvm_f)... , Value (mround; ctx), Value (mfpexcept; ctx)])
58
53
ret! (builder, val)
59
54
end
@@ -69,7 +64,5 @@ using Test
69
64
@test cadd (1.0 , 2.0 ) == 3.0
70
65
71
66
using InteractiveUtils
72
- io = IOBuffer ()
73
- code_llvm (io, cadd, (Float32, Float32))
74
- seekstart (io)
75
- @test occursin (" @llvm.experimental.constrained.fadd.f32" , String (take! (io)))
67
+ ir = sprint (io-> code_llvm (io, cadd, (Float32, Float32)))
68
+ @test occursin (" @llvm.experimental.constrained.fadd.f32" , ir)
0 commit comments