# typical beginning: int32 callerreg0 int32 callerreg1 int32 callerreg2 int32 callerreg3 int32 callerreg4 caller callerreg0 caller callerreg1 caller callerreg2 caller callerreg3 caller callerreg4 stack32 savereg0 stack32 savereg1 stack32 savereg2 stack32 savereg3 stack32 savereg4 # and now a function definition: enter addvector stack32 u_stack stack32 v_stack stack32 w_stack stack32 len_stack input u_stack input v_stack input w_stack input len_stack int32 u int32 v int32 w int32 len float80 x # save the caller's 5 registers so we can use them # (overkill for this function, but normal for bigger functions) savereg0 = callerreg0 savereg1 = callerreg1 savereg2 = callerreg2 savereg3 = callerreg3 savereg4 = callerreg4 # load the function parameters into registers u = u_stack v = v_stack w = w_stack len = len_stack # warning: the correct syntax here will change; # you'll have to put ==? in front of the len-0 # to indicate that it's setting the == flag len - 0 goto bottom if == top: x = *(float64 *) (v + 0) v += 8 x += *(float64 *) (w + 0) w += 8 *(float64 *) (u + 0) = x u += 8 len -= 1 goto top if != bottom: # restore the registers that we saved: callerreg0 = savereg0 callerreg1 = savereg1 callerreg2 = savereg2 callerreg3 = savereg3 callerreg4 = savereg4 leave