One offset, two bases
Index two arrays by the same variable and the compiler computes the scaled byte offset once, then reuses it. i*size ends up in one register, and each lwzx pairs that offset with its own base pointer — so the two array bases show up in r3 and r4. This is the clearest demonstration that an indexed load wants two register operands: freeze the offset, swap the base, and you're walking a second array.
add_arrays(x, y, j) reads x[j] and y[j], then adds them:
slwi r0, r5, 2 # j * 4 (j is the third arg, in r5)
lwzx r3, r3, r0 # x[j] (base x in r3 + offset)
lwzx r0, r4, r0 # y[j] (base y in r4 + same offset)
add r3, r3, r0 # x[j] + y[j]
blr
One slwi scales j. The offset sits in r0 and drives both lwzx instructions; only the base register differs. Your target also combines two arrays at the same index, but with a different operation — check the instruction after the two lwzx to find out which.
Your task
Write func_800a85f4 to reproduce the assembly above.