Two products in parallel
Multiplications and additions compile to a chain of arithmetic instructions. Each result rides into the next one through a scratch register. You've seen this with add/subtract chains already; the only new face here is mullw.
Take fused_chain(p, q, r, s), multiplying a pair, adding a third value, and subtracting 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, run in dependency order. The multiply goes first because of precedence. Then add folds in p, and subf strips off s at the end. The product feeds the sum, 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, then 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.