|
50 | 50 | @inline mutable_register(::Type{T}) where {T<:Array} = true |
51 | 51 | @inline mutable_register(::Type{T}) where {T} = ismutabletype(T) |
52 | 52 |
|
53 | | -@inline function atomicrmw_add!(ptr::Ptr{Float64}, val::Float64) |
54 | | - Base.llvmcall( |
55 | | - "atomicrmw fadd double* %0, double %1 monotonic\nret void", |
56 | | - Cvoid, |
57 | | - Tuple{Ptr{Float64}, Float64}, |
58 | | - ptr, |
59 | | - val |
60 | | - ) |
| 53 | +@generated function atomicrmw_add!(ptr::Ptr{Float64}, val::Float64) |
| 54 | + ptr_type = (Int == Int64) ? "i64" : "i32" |
| 55 | + ir = """ |
| 56 | + %ptr = inttoptr $ptr_type %0 to double* |
| 57 | + atomicrmw fadd double* %ptr, double %1 monotonic |
| 58 | + ret void |
| 59 | + """ |
| 60 | + return quote |
| 61 | + Base.@_inline_meta |
| 62 | + Base.llvmcall($ir, Cvoid, Tuple{Ptr{Float64}, Float64}, ptr, val) |
| 63 | + end |
61 | 64 | end |
62 | 65 |
|
63 | | -@inline function atomicrmw_add!(ptr::Ptr{Float32}, val::Float32) |
64 | | - Base.llvmcall( |
65 | | - "atomicrmw fadd float* %0, float %1 monotonic\nret void", |
66 | | - Cvoid, |
67 | | - Tuple{Ptr{Float32}, Float32}, |
68 | | - ptr, |
69 | | - val |
70 | | - ) |
| 66 | +@generated function atomicrmw_add!(ptr::Ptr{Float32}, val::Float32) |
| 67 | + ptr_type = (Int == Int64) ? "i64" : "i32" |
| 68 | + ir = """ |
| 69 | + %ptr = inttoptr $ptr_type %0 to float* |
| 70 | + atomicrmw fadd float* %ptr, float %1 monotonic |
| 71 | + ret void |
| 72 | + """ |
| 73 | + return quote |
| 74 | + Base.@_inline_meta |
| 75 | + Base.llvmcall($ir, Cvoid, Tuple{Ptr{Float32}, Float32}, ptr, val) |
| 76 | + end |
71 | 77 | end |
72 | 78 |
|
73 | 79 |
|
|
0 commit comments