>Date: Tue, 7 Oct 1997 17:43:52 -0400 (EDT) >To: Jim Plank>Subject: One more question on Assemble > >When I transform the following > x = x + y*z + 10; >does the order of calculation counts ? I mean I can have many >(really many !) different but equivalent ways to do this, f.g. > Way 1: > mv #10 -> %r0 > ld [fp] -> %r1 / assume [fp] is z > ld [fp-4] -> %r2 / assume [fp-4] is y > mul %r1, %r2 -> %r1 > add %r0, %r1 -> %r0 > ld [fp-8] -> %r1 /assume [fp-8] is x > add %r0, %r1 -> %r0 > st %r0 -> [fp-8] > >Way 2, do multiplication of y and z first, then load and add 10 > then load and add x > >Even for y*z, I can load either z first or y first. Do I have to >load z first ? > You can do it in any order you want as long as you retain C's semantics. For that reason, I think the following is probably best: ld [fp-8] -> %r0 ld [fp-4] -> %r1 ld [fp] -> %r2 mul %r1, %r2 -> %r1 add %r0, %r1 -> %r0 mv #10 -> %r1 add %r0, %r1 -> %r0 st %r0 -> [fp-8] Note, this assumes that you are allowed to mess with r2 without saving it first. If this were in a procedure like the following: int a(int x, int y, int z) { x = x + y*z + 10; return x; } Then you'd get something like the following: st %r2 -> [sp]--; ld [fp+12] -> %r0 ld [fp+16] -> %r1 ld [fp+20] -> %r2 mul %r1, %r2 -> %r1 add %r0, %r1 -> %r0 mv #10 -> %r1 add %r0, %r1 -> %r0 st %r0 -> [fp+12] ld [fp+12] -> %r0 ld ++[sp] -> %r2 ret Jim Plank