Notes for EECS373 February 8, 2005 example from lecture int fun(int a, int b, int c, int d, int e) int w, x, y, z; x = a + b; w = b + c; y = x + w; z = other(c, d); x = z + y + c + a + e; return(x); } Register assignments: parameter a passed into fun in parameter register r3 saved in nonvolatile register r30 parameter b passed into fun in parameter register r4 parameter c passed into fun in parameter register r5 saved in nonvolatile register r29 copied into r3 when used as a parameter to other parameter d passed into fun in parameter register r6 copied into r4 when used as a parameter to other parameter e passed into fun in parameter register r7 saved in r28 local variable w in volatile register r8 local variable x in volatile register r9 before call to other in r3 when final sum is computed and returned local variable y in nonvolatile register r31 local variable z returned from other in r3, used directly from there fun: mfspr r0, LR // get link register value stw r0, 4(r1) // save in parent stack frame stwu r1, -24(r1) // create new stack frame stw r28, 8(r1) // save nonvolatile r28 stw r29, 12(r1) // save nonvolatile r29 stw r30, 16(r1) // save nonvolatile r30 stw r31, 20(r1) // save nonvolatile r31 ori r30, r3, 0 // backup a ori r29, r5, 0 // backup c ori r28, r7, 0 // backup e add r9, r30, r4 // x = a + b add r8, r4, r29 // w = b + c add r31, r9, r8 // y = x + w ori r3, r5, 0 // set up parameter c ori r4, r6, 0 // set up parameter d bl other // z = other(c, d) add r3, r3, r31 // z + y add r3, r3, r29 // + c add r3, r3, r30 // + a add r3, r3, r28 // + e lwz r31, 20(r1) // restore nonvolatile r31 lwz r30, 16(r1) // restore nonvolatile r30 lwz r29, 12(r1) // restore nonvolatile r29 lwz r28, 8(r1) // restore nonvolatile r28 addi r1, r1, 24 // move stack pointer (delete stack frame) lwz r0, 4(r1) // get saved LR value (return address) mtspr LR, r0 // put back into LR blr // return