void generateFunctionCall(tree *t, int isStatment) { unsigned int numSaves, i; const char *savedRegs[32]; static const char *regnames[] = { "$0" , "$1" , "$2" , "$3" , "$4" , "$5" , "$6" , "$7" , "$8" , "$9" , "$10", "$11", "$12", "$13", "$14", "$15", "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31" }; memset(&savedRegs, 0, sizeof(savedRegs)); if(numLocVars == -1) { fprintf(stderr, "numLocVars is -1\n"); } if(numParams == -1) { fprintf(stderr, "numParams is -1\n"); } if(exprdepth == -1) { fprintf(stderr, "exprdepth is -1\n"); } /* Store registers */ numSaves = 0; if(isStatment) { savedRegs[numSaves] = "$0"; numSaves++; } else { switch(exprdepth) { case 11: savedRegs[numSaves] = "$24"; numSaves++; case 10: savedRegs[numSaves] = "$23"; numSaves++; case 9: savedRegs[numSaves] = "$22"; numSaves++; case 8: savedRegs[numSaves] = "$8"; numSaves++; case 7: savedRegs[numSaves] = "$7"; numSaves++; case 6: savedRegs[numSaves] = "$6"; numSaves++; case 5: savedRegs[numSaves] = "$5"; numSaves++; case 4: savedRegs[numSaves] = "$4"; numSaves++; case 3: savedRegs[numSaves] = "$3"; numSaves++; case 2: savedRegs[numSaves] = "$2"; numSaves++; case 1: savedRegs[numSaves] = "$1"; numSaves++; case 0: if(strcmp(t->reg, "$0") != 0) { savedRegs[numSaves] = "$0"; numSaves++; } break; default: fprintf(stderr, "Unexpected expression depth %d\n", exprdepth); } } for(i = 0; i < numLocVars; i++) { if((i + exprdepth) < 8) { savedRegs[numSaves] = regnames[i + exprdepth + 1]; } else if(i + exprdepth < 11) { savedRegs[numSaves] = regnames[22 - 8 + 1 + i + exprdepth]; } else { fprintf(stderr, "Unhandled register save situation\n"); } numSaves++; } for(i = 0; i < numParams; i++) { savedRegs[numSaves] = regnames[16 + i]; numSaves++; }