|
541 | 541 | # fma # |
542 | 542 | #-----# |
543 | 543 |
|
| 544 | +@inline function calc_fma_xyz(x::Dual{T,V,N}, |
| 545 | + y::Dual{T,V,N}, |
| 546 | + z::Dual{T,V,N}) where {T, V<:SIMDFloat,N} |
| 547 | + xv, yv, zv = value(x), value(y), value(z) |
| 548 | + rv = fma(xv, yv, zv) |
| 549 | + N == 0 && return Dual{T}(rv) |
| 550 | + xp, yp, zp = Vec(partials(x).values), Vec(partials(y).values), Vec(partials(z).values) |
| 551 | + parts = Tuple(fma(xv, yp, fma(yv, xp, zp))) |
| 552 | + Dual{T}(rv, parts) |
| 553 | +end |
544 | 554 | @generated function calc_fma_xyz(x::Dual{T,<:Any,N}, |
545 | 555 | y::Dual{T,<:Any,N}, |
546 | 556 | z::Dual{T,<:Any,N}) where {T,N} |
|
583 | 593 | # muladd # |
584 | 594 | #--------# |
585 | 595 |
|
| 596 | +@inline function calc_muladd_xyz(x::Dual{T,V,N}, |
| 597 | + y::Dual{T,V,N}, |
| 598 | + z::Dual{T,V,N}) where {T, V<:SIMDType,N} |
| 599 | + xv, yv, zv = value(x), value(y), value(z) |
| 600 | + rv = muladd(xv, yv, zv) |
| 601 | + N == 0 && return Dual{T}(rv) |
| 602 | + xp, yp, zp = Vec(partials(x).values), Vec(partials(y).values), Vec(partials(z).values) |
| 603 | + parts = Tuple(muladd(xv, yp, muladd(yv, xp, zp))) |
| 604 | + Dual{T}(rv, parts) |
| 605 | +end |
586 | 606 | @generated function calc_muladd_xyz(x::Dual{T,<:Any,N}, |
587 | 607 | y::Dual{T,<:Any,N}, |
588 | 608 | z::Dual{T,<:Any,N}) where {T,N} |
|
0 commit comments