fprOffset[fpr] = dstOffset;
fprOffset[fpr] = dstOffset.toInt();
  private final void genParameterCopy (int srcOffset, int dstOffset) {    int gpr = 0;  // number of general purpose registers unloaded    int fpr = 0;  // number of floating point registers unloaded    byte  T = T0; // next GPR to get a parameter    if (!method.isStatic()) { // handle "this" parameter      if (gpr < NUM_PARAMETER_GPRS) {        asm.emitMOV_RegDisp_Reg(SP, dstOffset, T);        T = T1; // at most 2 parameters can be passed in general purpose registers        gpr++;      } else { // no parameters passed in registers        asm.emitMOV_Reg_RegDisp(S0, SP, srcOffset);        asm.emitMOV_RegDisp_Reg(SP, dstOffset, S0);      }      srcOffset -= WORDSIZE;      dstOffset -= WORDSIZE;    }    VM_TypeReference [] types     = method.getParameterTypes();    int     [] fprOffset = new     int [NUM_PARAMETER_FPRS]; // to handle floating point parameters in registers    boolean [] is32bit   = new boolean [NUM_PARAMETER_FPRS]; // to handle floating point parameters in registers    for (int i=0; i<types.length; i++) {      VM_TypeReference t = types[i];      if (t.isLongType()) {        if (gpr < NUM_PARAMETER_GPRS) {          asm.emitMOV_RegDisp_Reg(SP, dstOffset, T);    // hi mem := lo register (== hi order word)          T = T1;                                       // at most 2 parameters can be passed in general purpose registers          gpr++;          srcOffset -= WORDSIZE;          dstOffset -= WORDSIZE;          if (gpr < NUM_PARAMETER_GPRS) {            asm.emitMOV_RegDisp_Reg(SP, dstOffset, T);  // lo mem := hi register (== lo order word)            gpr++;          } else {            asm.emitMOV_Reg_RegDisp(S0, SP, srcOffset); // lo mem from caller's stackframe            asm.emitMOV_RegDisp_Reg(SP, dstOffset, S0);          }        } else {          asm.emitMOV_Reg_RegDisp(S0, SP, srcOffset);   // hi mem from caller's stackframe          asm.emitMOV_RegDisp_Reg(SP, dstOffset, S0);          srcOffset -= WORDSIZE;          dstOffset -= WORDSIZE;          asm.emitMOV_Reg_RegDisp(S0, SP, srcOffset);   // lo mem from caller's stackframe          asm.emitMOV_RegDisp_Reg(SP, dstOffset, S0);        }        srcOffset -= WORDSIZE;        dstOffset -= WORDSIZE;      } else if (t.isFloatType()) {        if (fpr < NUM_PARAMETER_FPRS) {          fprOffset[fpr] = dstOffset;          is32bit[fpr]   = true;          fpr++;        } else {          asm.emitMOV_Reg_RegDisp(S0, SP, srcOffset);          asm.emitMOV_RegDisp_Reg(SP, dstOffset, S0);        }        srcOffset -= WORDSIZE;        dstOffset -= WORDSIZE;      } else if (t.isDoubleType()) {        if (fpr < NUM_PARAMETER_FPRS) {          srcOffset -= WORDSIZE;          dstOffset -= WORDSIZE;          fprOffset[fpr] = dstOffset;          is32bit[fpr]   = false;          fpr++;        } else {          asm.emitMOV_Reg_RegDisp(S0, SP, srcOffset);   // hi mem from caller's stackframe          asm.emitMOV_RegDisp_Reg(SP, dstOffset, S0);          srcOffset -= WORDSIZE;          dstOffset -= WORDSIZE;          asm.emitMOV_Reg_RegDisp(S0, SP, srcOffset);   // lo mem from caller's stackframe          asm.emitMOV_RegDisp_Reg(SP, dstOffset, S0);        }        srcOffset -= WORDSIZE;        dstOffset -= WORDSIZE;      } else { // t is object, int, short, char, byte, or boolean        if (gpr < NUM_PARAMETER_GPRS) {          asm.emitMOV_RegDisp_Reg(SP, dstOffset, T);          T = T1; // at most 2 parameters can be passed in general purpose registers          gpr++;        } else {          asm.emitMOV_Reg_RegDisp(S0, SP, srcOffset);          asm.emitMOV_RegDisp_Reg(SP, dstOffset, S0);        }        srcOffset -= WORDSIZE;        dstOffset -= WORDSIZE;      }    }    for (int i=fpr-1; 0<=i; i--) { // unload the floating point register stack (backwards)      if (is32bit[i]) {        asm.emitFSTP_RegDisp_Reg(SP, fprOffset[i], FP0);      } else {        asm.emitFSTP_RegDisp_Reg_Quad(SP, fprOffset[i], FP0);      }    }  }