SUMPROD_XELEM¶
The SUMPROD_XELEM cost is the per-extra-element slope of the extended-precision sumprod
algorithm: the latency difference between its 8-element and 2-element forms — probes
f_add_sumprod8 and f_add_sumprod2 — divided by the 6 extra elements. Exemplar of the same
construction as DIST_XARG and HYPOT_XARG: the two sides are
the same algorithm at two sizes, so the diff is expected to be large — what must hold is that
every added line belongs to the six extra elements, and nothing shared changed shape. Both
probes port CPython's compensated (TripleLength) accumulation, error terms emitted through
the llvm.fma intrinsic — see the SUMPROD page for the algorithm.
What Python code counts into SUMPROD_XELEM is described in
FLOP types.
Inner-loop diff¶
--- f_add_sumprod2
+++ f_add_sumprod8
.L0:
- ldr %d0, [%x0, #8]!
+ lsl %x0, %x1, #3
+ add %x2, %x3, %x0
+ ldr %d0, [%x2]
fmul %d1, %d0, %d2
+ cmp %x1, #0
+ csel %x4, %x5, xzr, eq
fadd %d3, %d3, %d0
- ldr %d0, [%x1]
+ add %x4, %x2, %x4, lsl #3
+ ldur %d0, [%x4, #-8]
fmul %d4, %d3, %d0
fnmsub %d3, %d3, %d0, %d4
fadd %d0, %d1, %d4
fsub %d5, %d0, %d1
fsub %d6, %d0, %d5
fsub %d6, %d1, %d6
fsub %d4, %d4, %d5
+ fadd %d5, %d1, %d3
+ fsub %d7, %d5, %d1
fadd %d4, %d4, %d6
- fadd %d5, %d1, %d3
- fsub %d6, %d5, %d1
- fsub %d7, %d5, %d6
- fsub %d7, %d1, %d7
- fsub %d3, %d3, %d6
- fadd %d3, %d3, %d7
+ fsub %d6, %d5, %d7
+ fsub %d6, %d1, %d6
+ fsub %d3, %d3, %d7
+ fadd %d3, %d3, %d6
fadd %d6, %d5, %d4
fsub %d7, %d6, %d5
fsub %d8, %d6, %d7
+ cmp %x1, #2
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d9, [%x4, #-16]
+ fsub %d4, %d4, %d7
+ cmp %x1, #3
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d7, [%x4, #-24]
+ fmul %d10, %d9, %d7
fsub %d5, %d5, %d8
+ fnmsub %d7, %d9, %d7, %d10
+ fadd %d8, %d0, %d10
+ fsub %d9, %d8, %d0
+ fsub %d11, %d8, %d9
+ fsub %d0, %d0, %d11
+ fadd %d4, %d4, %d5
+ fsub %d5, %d10, %d9
+ fadd %d0, %d5, %d0
+ fadd %d5, %d7, %d6
+ fsub %d9, %d5, %d6
+ fsub %d10, %d5, %d9
+ fadd %d3, %d3, %d4
+ fsub %d4, %d6, %d10
+ fsub %d6, %d7, %d9
+ fadd %d7, %d5, %d0
+ fsub %d9, %d7, %d5
+ fsub %d10, %d7, %d9
+ fadd %d4, %d6, %d4
+ fsub %d0, %d0, %d9
+ cmp %x1, #4
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d6, [%x4, #-32]
+ fsub %d5, %d5, %d10
+ cmp %x1, #5
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d9, [%x4, #-40]
+ fmul %d10, %d6, %d9
+ fadd %d1, %d1, %d3
+ fnmsub %d3, %d6, %d9, %d10
+ fadd %d6, %d8, %d10
+ fsub %d9, %d6, %d8
+ fsub %d11, %d6, %d9
+ fsub %d8, %d8, %d11
+ fadd %d0, %d0, %d5
+ fsub %d5, %d10, %d9
+ fadd %d5, %d5, %d8
+ fadd %d8, %d3, %d7
+ fsub %d9, %d8, %d7
+ fsub %d10, %d8, %d9
+ fadd %d0, %d4, %d0
+ fsub %d4, %d7, %d10
+ fsub %d3, %d3, %d9
+ fadd %d7, %d8, %d5
+ fsub %d9, %d7, %d8
+ fsub %d10, %d7, %d9
+ fadd %d3, %d3, %d4
+ fsub %d4, %d5, %d9
+ cmp %x1, #6
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d5, [%x4, #-48]
+ fsub %d8, %d8, %d10
+ cmp %x1, #7
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d9, [%x4, #-56]
+ fmul %d10, %d5, %d9
+ fadd %d1, %d1, %d0
+ fnmsub %d0, %d5, %d9, %d10
+ fadd %d5, %d6, %d10
+ fsub %d9, %d5, %d6
+ fsub %d11, %d5, %d9
+ fsub %d6, %d6, %d11
+ fadd %d4, %d4, %d8
+ fsub %d8, %d10, %d9
+ fadd %d6, %d8, %d6
+ fadd %d8, %d0, %d7
+ fsub %d9, %d8, %d7
+ fsub %d10, %d8, %d9
+ fadd %d3, %d3, %d4
+ fsub %d4, %d7, %d10
+ fsub %d0, %d0, %d9
+ fadd %d7, %d8, %d6
+ fsub %d9, %d7, %d8
+ fsub %d10, %d7, %d9
+ fadd %d0, %d0, %d4
+ fsub %d4, %d6, %d9
+ cmp %x1, #8
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d6, [%x4, #-64]
+ fsub %d8, %d8, %d10
+ cmp %x1, #9
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d9, [%x4, #-72]
+ fmul %d10, %d6, %d9
+ fadd %d1, %d1, %d3
+ fnmsub %d3, %d6, %d9, %d10
+ fadd %d6, %d5, %d10
+ fsub %d9, %d6, %d5
+ fsub %d11, %d6, %d9
+ fsub %d5, %d5, %d11
+ fadd %d4, %d4, %d8
+ fsub %d8, %d10, %d9
+ fadd %d5, %d8, %d5
+ fadd %d8, %d3, %d7
+ fsub %d9, %d8, %d7
+ fsub %d10, %d8, %d9
+ fadd %d0, %d0, %d4
+ fsub %d4, %d7, %d10
+ fsub %d3, %d3, %d9
+ fadd %d7, %d8, %d5
+ fsub %d9, %d7, %d8
+ fsub %d10, %d7, %d9
+ fadd %d3, %d3, %d4
+ fsub %d4, %d5, %d9
+ cmp %x1, #10
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d5, [%x4, #-80]
+ fsub %d8, %d8, %d10
+ cmp %x1, #11
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d9, [%x4, #-88]
+ fmul %d10, %d5, %d9
+ fadd %d1, %d1, %d0
+ fnmsub %d0, %d5, %d9, %d10
+ fadd %d5, %d6, %d10
+ fsub %d9, %d5, %d6
+ fsub %d11, %d5, %d9
+ fsub %d6, %d6, %d11
+ fadd %d4, %d4, %d8
+ fsub %d8, %d10, %d9
+ fadd %d6, %d8, %d6
+ fadd %d8, %d0, %d7
+ fsub %d9, %d8, %d7
+ fsub %d10, %d8, %d9
+ fadd %d3, %d3, %d4
+ fsub %d4, %d7, %d10
+ fsub %d0, %d0, %d9
+ fadd %d7, %d8, %d6
+ fsub %d9, %d7, %d8
+ fsub %d10, %d7, %d9
+ fadd %d0, %d0, %d4
+ fsub %d4, %d6, %d9
+ cmp %x1, #12
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d6, [%x4, #-96]
+ fsub %d8, %d8, %d10
+ cmp %x1, #13
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d9, [%x4, #-104]
+ fmul %d10, %d6, %d9
+ fadd %d1, %d1, %d3
+ fnmsub %d3, %d6, %d9, %d10
+ fadd %d6, %d5, %d10
+ fsub %d9, %d6, %d5
+ fsub %d11, %d6, %d9
+ fsub %d5, %d5, %d11
+ fadd %d4, %d4, %d8
+ fsub %d8, %d10, %d9
+ fadd %d5, %d8, %d5
+ fadd %d8, %d3, %d7
+ fsub %d9, %d8, %d7
+ fsub %d10, %d8, %d9
+ fadd %d0, %d0, %d4
+ fsub %d4, %d7, %d10
+ fsub %d3, %d3, %d9
+ fadd %d7, %d8, %d5
+ fsub %d9, %d7, %d8
+ fsub %d10, %d7, %d9
+ fadd %d3, %d3, %d4
+ fsub %d4, %d5, %d9
+ cmp %x1, #14
+ csel %x4, %x5, xzr, lo
+ add %x4, %x2, %x4, lsl #3
+ ldur %d5, [%x4, #-112]
+ fsub %d8, %d8, %d10
+ cmp %x1, #15
+ csel %x4, %x5, xzr, lo
+ add %x2, %x2, %x4, lsl #3
+ ldur %d9, [%x2, #-120]
+ fmul %d10, %d5, %d9
+ fadd %d1, %d1, %d0
+ fnmsub %d0, %d5, %d9, %d10
+ fadd %d5, %d6, %d10
+ fsub %d9, %d5, %d6
+ fsub %d11, %d5, %d9
+ fsub %d6, %d6, %d11
+ fadd %d4, %d4, %d8
+ fsub %d8, %d10, %d9
+ fadd %d6, %d8, %d6
+ fadd %d8, %d0, %d7
+ fsub %d9, %d8, %d7
+ fsub %d10, %d8, %d9
+ fadd %d3, %d3, %d4
+ fsub %d4, %d7, %d10
+ add %x1, %x1, #1
+ fsub %d0, %d0, %d9
+ fadd %d0, %d0, %d4
+ fadd %d4, %d8, %d6
+ fadd %d1, %d1, %d3
+ fsub %d3, %d4, %d8
+ fsub %d7, %d4, %d3
+ fsub %d7, %d8, %d7
+ fsub %d3, %d6, %d3
+ fadd %d3, %d3, %d7
+ fadd %d3, %d0, %d3
+ fadd %d0, %d5, %d4
+ fsub %d6, %d0, %d4
+ fsub %d7, %d0, %d6
fsub %d4, %d4, %d7
- fadd %d4, %d4, %d5
- fadd %d3, %d3, %d4
- fadd %d3, %d1, %d3
- ldp %d4, %d1, [%x1, #-16]
- fmul %d5, %d1, %d4
- fnmsub %d1, %d1, %d4, %d5
- fadd %d4, %d0, %d5
- fsub %d7, %d4, %d0
- fsub %d8, %d4, %d7
- fsub %d0, %d0, %d8
- fsub %d5, %d5, %d7
- fadd %d0, %d5, %d0
- fadd %d5, %d1, %d6
- fsub %d7, %d5, %d6
- fsub %d8, %d5, %d7
- fsub %d6, %d6, %d8
- fsub %d1, %d1, %d7
- fadd %d1, %d1, %d6
- fadd %d6, %d5, %d0
- fsub %d7, %d6, %d5
- fsub %d8, %d6, %d7
- fsub %d5, %d5, %d8
- fsub %d0, %d0, %d7
- fadd %d0, %d0, %d5
- fadd %d0, %d1, %d0
- fadd %d3, %d3, %d0
- fadd %d0, %d4, %d6
- fsub %d1, %d0, %d6
- fsub %d5, %d0, %d1
- fsub %d5, %d6, %d5
- fsub %d1, %d4, %d1
- fadd %d1, %d1, %d5
- fadd %d3, %d1, %d3
- fadd %d3, %d0, %d3
- str %d3, [%x2], #8
- mov %x1, %x0
- subs %x3, %x3, #1
+ fsub %d5, %d5, %d6
+ fadd %d1, %d1, %d3
+ fadd %d3, %d5, %d4
+ fadd %d1, %d3, %d1
+ fadd %d3, %d0, %d1
+ str %d3, [%x6, %x0]
+ cmp %x7, %x1
b.ne .L0
Loop structure¶
f_add_sumprod2-- 2 innermost loop(s): 65 instructions, 62 instructionsf_add_sumprod8-- 1 innermost loop(s): 254 instructions
The listings below are the complete compiled functions the benchmark times, raw as numba emits them (the cpython call wrappers around them are omitted -- they never run inside the timed loop). Listing lengths reflect the compiler's unrolling choices, not the probes' amount of work -- see the discussion below.
Full ASM listing: f_add_sumprod2
cmp x2, #1
b.lt LBB0_9
cmp x3, #1
b.lt LBB0_9
ldr x8, [sp, #56]
ldp x10, x9, [sp]
sub x11, x10, #8
sub x12, x10, #16
sub x13, x10, #24
movi.2d v0, #0000000000000000
mov x14, #22377
movk x14, #35604, lsl #16
movk x14, #48906, lsl #32
movk x14, #16389, lsl #48
fmov d1, x14
b LBB0_4
LBB0_3:
subs x2, x2, #1
b.le LBB0_9
LBB0_4:
ldr d2, [x10]
fmul d3, d2, d0
fadd d2, d2, d1
ldr d4, [x11, x9, lsl #3]
fmul d5, d2, d4
fnmsub d2, d2, d4, d5
fadd d4, d3, d5
fsub d6, d4, d3
fsub d7, d4, d6
fsub d7, d3, d7
fsub d5, d5, d6
fadd d5, d5, d7
fadd d6, d3, d2
fsub d7, d6, d3
fsub d16, d6, d7
fsub d16, d3, d16
fsub d2, d2, d7
fadd d2, d2, d16
fadd d7, d6, d5
fsub d16, d7, d6
fsub d17, d7, d16
fsub d6, d6, d17
fsub d5, d5, d16
fadd d5, d5, d6
fadd d2, d2, d5
fadd d2, d3, d2
ldr d3, [x12, x9, lsl #3]
ldr d5, [x13, x9, lsl #3]
fmul d6, d3, d5
fnmsub d3, d3, d5, d6
fadd d5, d4, d6
fsub d16, d5, d4
fsub d17, d5, d16
fsub d4, d4, d17
fsub d6, d6, d16
fadd d4, d6, d4
fadd d6, d3, d7
fsub d16, d6, d7
fsub d17, d6, d16
fsub d7, d7, d17
fsub d3, d3, d16
fadd d3, d3, d7
fadd d7, d6, d4
fsub d16, d7, d6
fsub d17, d7, d16
fsub d6, d6, d17
fsub d4, d4, d16
fadd d4, d4, d6
fadd d3, d3, d4
fadd d2, d2, d3
fadd d3, d5, d7
fsub d4, d3, d7
fsub d6, d3, d4
fsub d6, d7, d6
fsub d4, d5, d4
fadd d4, d4, d6
fadd d2, d4, d2
fadd d2, d3, d2
str d2, [x8]
cmp x3, #1
b.eq LBB0_3
ldp d4, d3, [x10]
fmul d5, d3, d0
fadd d2, d2, d3
fmul d3, d2, d4
fnmsub d2, d2, d4, d3
fadd d4, d5, d3
fsub d6, d4, d5
fsub d7, d4, d6
fsub d7, d5, d7
fsub d3, d3, d6
fadd d3, d3, d7
fadd d6, d5, d2
fsub d7, d6, d5
fsub d16, d6, d7
fsub d16, d5, d16
fsub d2, d2, d7
fadd d2, d2, d16
fadd d7, d6, d3
fsub d16, d7, d6
fsub d17, d7, d16
fsub d6, d6, d17
fsub d3, d3, d16
fadd d3, d3, d6
fadd d2, d2, d3
fadd d2, d5, d2
ldr d3, [x11, x9, lsl #3]
ldr d5, [x12, x9, lsl #3]
fmul d6, d3, d5
fnmsub d3, d3, d5, d6
fadd d5, d4, d6
fsub d16, d5, d4
fsub d17, d5, d16
fsub d4, d4, d17
fsub d6, d6, d16
fadd d4, d6, d4
fadd d6, d3, d7
fsub d16, d6, d7
fsub d17, d6, d16
fsub d7, d7, d17
fsub d3, d3, d16
fadd d3, d3, d7
fadd d7, d6, d4
fsub d16, d7, d6
fsub d17, d7, d16
fsub d6, d6, d17
fsub d4, d4, d16
fadd d4, d4, d6
fadd d3, d3, d4
fadd d2, d2, d3
fadd d3, d5, d7
fsub d4, d3, d7
fsub d6, d3, d4
fsub d6, d7, d6
fsub d4, d5, d4
fadd d4, d4, d6
fadd d2, d4, d2
fadd d2, d3, d2
str d2, [x8, #8]
cmp x3, #2
b.eq LBB0_3
ldp d3, d5, [x10, #8]
fmul d4, d5, d0
fadd d2, d2, d5
ldr d5, [x10]
fmul d6, d2, d3
fnmsub d2, d2, d3, d6
fadd d3, d4, d6
fsub d7, d3, d4
fsub d16, d3, d7
fsub d16, d4, d16
fsub d6, d6, d7
fadd d6, d6, d16
fadd d7, d4, d2
fsub d16, d7, d4
fsub d17, d7, d16
fsub d17, d4, d17
fsub d2, d2, d16
fadd d2, d2, d17
fadd d16, d7, d6
fsub d17, d16, d7
fsub d18, d16, d17
fsub d7, d7, d18
fsub d6, d6, d17
fadd d6, d6, d7
fadd d2, d2, d6
fadd d2, d4, d2
ldr d4, [x11, x9, lsl #3]
fmul d6, d5, d4
fnmsub d4, d5, d4, d6
fadd d5, d3, d6
fsub d7, d5, d3
fsub d17, d5, d7
fsub d3, d3, d17
fsub d6, d6, d7
fadd d3, d6, d3
fadd d6, d4, d16
fsub d7, d6, d16
fsub d17, d6, d7
fsub d16, d16, d17
fsub d4, d4, d7
fadd d4, d4, d16
fadd d7, d6, d3
fsub d16, d7, d6
fsub d17, d7, d16
fsub d6, d6, d17
fsub d3, d3, d16
fadd d3, d3, d6
fadd d3, d4, d3
fadd d2, d2, d3
fadd d3, d5, d7
fsub d4, d3, d7
fsub d6, d3, d4
fsub d6, d7, d6
fsub d4, d5, d4
fadd d4, d4, d6
fadd d2, d4, d2
fadd d2, d3, d2
str d2, [x8, #16]
cmp x3, #3
b.eq LBB0_3
add x17, x10, #16
sub x14, x3, #3
add x15, x8, #24
mov x16, x17
LBB0_8:
ldr d3, [x16, #8]!
fmul d4, d3, d0
fadd d2, d2, d3
ldr d3, [x17]
fmul d5, d2, d3
fnmsub d2, d2, d3, d5
fadd d3, d4, d5
fsub d6, d3, d4
fsub d7, d3, d6
fsub d7, d4, d7
fsub d5, d5, d6
fadd d5, d5, d7
fadd d6, d4, d2
fsub d7, d6, d4
fsub d16, d6, d7
fsub d16, d4, d16
fsub d2, d2, d7
fadd d2, d2, d16
fadd d7, d6, d5
fsub d16, d7, d6
fsub d17, d7, d16
fsub d6, d6, d17
fsub d5, d5, d16
fadd d5, d5, d6
fadd d2, d2, d5
fadd d2, d4, d2
ldp d5, d4, [x17, #-16]
fmul d6, d4, d5
fnmsub d4, d4, d5, d6
fadd d5, d3, d6
fsub d16, d5, d3
fsub d17, d5, d16
fsub d3, d3, d17
fsub d6, d6, d16
fadd d3, d6, d3
fadd d6, d4, d7
fsub d16, d6, d7
fsub d17, d6, d16
fsub d7, d7, d17
fsub d4, d4, d16
fadd d4, d4, d7
fadd d7, d6, d3
fsub d16, d7, d6
fsub d17, d7, d16
fsub d6, d6, d17
fsub d3, d3, d16
fadd d3, d3, d6
fadd d3, d4, d3
fadd d2, d2, d3
fadd d3, d5, d7
fsub d4, d3, d7
fsub d6, d3, d4
fsub d6, d7, d6
fsub d4, d5, d4
fadd d4, d4, d6
fadd d2, d4, d2
fadd d2, d3, d2
str d2, [x15], #8
mov x17, x16
subs x14, x14, #1
b.ne LBB0_8
b LBB0_3
LBB0_9:
str xzr, [x0]
mov w0, #0
ret
Full ASM listing: f_add_sumprod8
cmp x2, #1
b.lt LBB0_6
cmp x3, #1
b.lt LBB0_6
ldr x8, [sp, #56]
ldp x10, x9, [sp]
mov x11, #22377
movk x11, #35604, lsl #16
movk x11, #48906, lsl #32
movk x11, #16389, lsl #48
fmov d0, x11
movi.2d v1, #0000000000000000
LBB0_3:
mov x12, #0
mov.16b v3, v0
LBB0_4:
lsl x11, x12, #3
add x13, x10, x11
ldr d4, [x13]
fmul d2, d4, d1
cmp x12, #0
csel x14, x9, xzr, eq
fadd d3, d3, d4
add x14, x13, x14, lsl #3
ldur d4, [x14, #-8]
fmul d5, d3, d4
fnmsub d3, d3, d4, d5
fadd d4, d2, d5
fsub d6, d4, d2
fsub d7, d4, d6
fsub d7, d2, d7
fsub d5, d5, d6
fadd d6, d2, d3
fsub d16, d6, d2
fadd d5, d5, d7
fsub d7, d6, d16
fsub d7, d2, d7
fsub d3, d3, d16
fadd d3, d3, d7
fadd d7, d6, d5
fsub d16, d7, d6
fsub d17, d7, d16
cmp x12, #2
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d18, [x14, #-16]
fsub d5, d5, d16
cmp x12, #3
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d16, [x14, #-24]
fmul d19, d18, d16
fsub d6, d6, d17
fnmsub d16, d18, d16, d19
fadd d17, d4, d19
fsub d18, d17, d4
fsub d20, d17, d18
fsub d4, d4, d20
fadd d5, d5, d6
fsub d6, d19, d18
fadd d4, d6, d4
fadd d6, d16, d7
fsub d18, d6, d7
fsub d19, d6, d18
fadd d3, d3, d5
fsub d5, d7, d19
fsub d7, d16, d18
fadd d16, d6, d4
fsub d18, d16, d6
fsub d19, d16, d18
fadd d5, d7, d5
fsub d4, d4, d18
cmp x12, #4
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d7, [x14, #-32]
fsub d6, d6, d19
cmp x12, #5
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d18, [x14, #-40]
fmul d19, d7, d18
fadd d2, d2, d3
fnmsub d3, d7, d18, d19
fadd d7, d17, d19
fsub d18, d7, d17
fsub d20, d7, d18
fsub d17, d17, d20
fadd d4, d4, d6
fsub d6, d19, d18
fadd d6, d6, d17
fadd d17, d3, d16
fsub d18, d17, d16
fsub d19, d17, d18
fadd d4, d5, d4
fsub d5, d16, d19
fsub d3, d3, d18
fadd d16, d17, d6
fsub d18, d16, d17
fsub d19, d16, d18
fadd d3, d3, d5
fsub d5, d6, d18
cmp x12, #6
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d6, [x14, #-48]
fsub d17, d17, d19
cmp x12, #7
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d18, [x14, #-56]
fmul d19, d6, d18
fadd d2, d2, d4
fnmsub d4, d6, d18, d19
fadd d6, d7, d19
fsub d18, d6, d7
fsub d20, d6, d18
fsub d7, d7, d20
fadd d5, d5, d17
fsub d17, d19, d18
fadd d7, d17, d7
fadd d17, d4, d16
fsub d18, d17, d16
fsub d19, d17, d18
fadd d3, d3, d5
fsub d5, d16, d19
fsub d4, d4, d18
fadd d16, d17, d7
fsub d18, d16, d17
fsub d19, d16, d18
fadd d4, d4, d5
fsub d5, d7, d18
cmp x12, #8
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d7, [x14, #-64]
fsub d17, d17, d19
cmp x12, #9
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d18, [x14, #-72]
fmul d19, d7, d18
fadd d2, d2, d3
fnmsub d3, d7, d18, d19
fadd d7, d6, d19
fsub d18, d7, d6
fsub d20, d7, d18
fsub d6, d6, d20
fadd d5, d5, d17
fsub d17, d19, d18
fadd d6, d17, d6
fadd d17, d3, d16
fsub d18, d17, d16
fsub d19, d17, d18
fadd d4, d4, d5
fsub d5, d16, d19
fsub d3, d3, d18
fadd d16, d17, d6
fsub d18, d16, d17
fsub d19, d16, d18
fadd d3, d3, d5
fsub d5, d6, d18
cmp x12, #10
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d6, [x14, #-80]
fsub d17, d17, d19
cmp x12, #11
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d18, [x14, #-88]
fmul d19, d6, d18
fadd d2, d2, d4
fnmsub d4, d6, d18, d19
fadd d6, d7, d19
fsub d18, d6, d7
fsub d20, d6, d18
fsub d7, d7, d20
fadd d5, d5, d17
fsub d17, d19, d18
fadd d7, d17, d7
fadd d17, d4, d16
fsub d18, d17, d16
fsub d19, d17, d18
fadd d3, d3, d5
fsub d5, d16, d19
fsub d4, d4, d18
fadd d16, d17, d7
fsub d18, d16, d17
fsub d19, d16, d18
fadd d4, d4, d5
fsub d5, d7, d18
cmp x12, #12
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d7, [x14, #-96]
fsub d17, d17, d19
cmp x12, #13
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d18, [x14, #-104]
fmul d19, d7, d18
fadd d2, d2, d3
fnmsub d3, d7, d18, d19
fadd d7, d6, d19
fsub d18, d7, d6
fsub d20, d7, d18
fsub d6, d6, d20
fadd d5, d5, d17
fsub d17, d19, d18
fadd d6, d17, d6
fadd d17, d3, d16
fsub d18, d17, d16
fsub d19, d17, d18
fadd d4, d4, d5
fsub d5, d16, d19
fsub d3, d3, d18
fadd d16, d17, d6
fsub d18, d16, d17
fsub d19, d16, d18
fadd d3, d3, d5
fsub d5, d6, d18
cmp x12, #14
csel x14, x9, xzr, lo
add x14, x13, x14, lsl #3
ldur d6, [x14, #-112]
fsub d17, d17, d19
cmp x12, #15
csel x14, x9, xzr, lo
add x13, x13, x14, lsl #3
ldur d18, [x13, #-120]
fmul d19, d6, d18
fadd d2, d2, d4
fnmsub d4, d6, d18, d19
fadd d6, d7, d19
fsub d18, d6, d7
fsub d20, d6, d18
fsub d7, d7, d20
fadd d5, d5, d17
fsub d17, d19, d18
fadd d7, d17, d7
fadd d17, d4, d16
fsub d18, d17, d16
fsub d19, d17, d18
fadd d3, d3, d5
fsub d5, d16, d19
add x12, x12, #1
fsub d4, d4, d18
fadd d4, d4, d5
fadd d5, d17, d7
fadd d2, d2, d3
fsub d3, d5, d17
fsub d16, d5, d3
fsub d16, d17, d16
fsub d3, d7, d3
fadd d3, d3, d16
fadd d3, d4, d3
fadd d4, d6, d5
fsub d7, d4, d5
fsub d16, d4, d7
fsub d5, d5, d16
fsub d6, d6, d7
fadd d2, d2, d3
fadd d3, d6, d5
fadd d2, d3, d2
fadd d3, d4, d2
str d3, [x8, x11]
cmp x3, x12
b.ne LBB0_4
subs x2, x2, #1
b.gt LBB0_3
LBB0_6:
str xzr, [x0]
mov w0, #0
ret
Discussion¶
The subtraction isolates six extra elements' worth of the compensated accumulation, and the ÷6 therefore prices one element.
- Intended work, and nothing else: per extra element, the additions decompose into two
loads, the product and its fused error term (
fmul+fnmsub), and the three six-instruction error-free sums folding the pair into the running total — six of each. The shared skeleton (the first element's product off the fed-back chain, the opaque-zero guard, the close-out, store, loop control) appears once on both sides. - Integer-side asymmetry, off the measured chain: the arity-8 loop materializes each
wrapped negative index with a
cmp/csel/addtriple per load, where the arity-2 form's peeled first iteration lets the steady state use precomputed base pointers. That work runs on the integer ports, overlapping the floating-point chain — the same class of side traffic as the REMAINDER probe's per-iteration pointer reload — so the floating-point latency slope is unaffected. - In the dependency chain: the hi-lane accumulation lengthens proportionally with the element count while the lo/tiny lanes overlap it — the measured overlap is the algorithm's real instruction-level parallelism, and the reason the slope is priced as a unit rather than as a per-operation chain.
- Loop-structure symmetry: neither probe unrolls;
f_add_sumprod2's two regions are its peeled first iteration plus steady state, while the arity-8 loop (carrying thecselindex handling instead) compiles to a single region. The diff shows the best-matching region pair.