Two products in parallel
Multiplies, adds, and subtracts all compile to the same kind of chain: each arithmetic instruction hands its result to the next through a scratch register. You've seen it with add/subtract chains already; the only new face here is mullw.
Take fused_chain(p, q, r, s) — multiply a pair, add a third value, subtract the fourth:
mullw r0, r4, r5 # r0 = q * r
add r0, r3, r0 # r0 = p + (q * r)
subf r3, r6, r0 # r3 = r0 - s
blr
Three instructions in dependency order. The multiply goes first because of precedence, add folds in p, and subf strips off s at the end. The product feeds the sum and the sum feeds the subtraction, so the compiler never has to reorder anything.
The target assembly is laid out differently. Walk it one instruction at a time, note what each computes and which registers feed it, and let the operand order on the final instruction tell you how the expression goes back together.
Your task
Write func_801c25bc to reproduce the assembly above.