hiword = VM_Magic.getMemoryWord(fprarray.add(fpr*8)); loword = VM_Magic.getMemoryWord(fprarray.add(fpr*8 + 4));
hiword = VM_Magic.getMemoryInt(fprarray.add(fpr*8)); loword = VM_Magic.getMemoryInt(fprarray.add(fpr*8 + 4));
  static void packageArgumentForSVR4(VM_TypeReference[] argTypes, Object[] argObjectArray,				     VM_Address gprarray, VM_Address fprarray,				     VM_Address overflowarea, int gpr, int fpr,				     VM_JNIEnvironment env) {    // also make overflow offset, we may need to round it    int overflowoffset = 0;    int argCount = argTypes.length;    // now interpret values by types, see PPC ABI    for (int i=0; i<argCount; i++) {      if (argTypes[i].isFloatType()	  || argTypes[i].isDoubleType()) {	int loword, hiword;	if (fpr > LAST_OS_PARAMETER_FPR) {	  // overflow, OTHER	  // round it, bytes are saved from lowest to highest one, regardless endian	  overflowoffset = (overflowoffset + 7) & -8;	  hiword = VM_Magic.getMemoryWord(overflowarea.add(overflowoffset));	  overflowoffset += 4;	  loword = VM_Magic.getMemoryWord(overflowarea.add(overflowoffset));	  overflowoffset += 4;	} else {	  // get value from fpr, increase fpr by 1	  hiword = VM_Magic.getMemoryWord(fprarray.add(fpr*8));	  loword = VM_Magic.getMemoryWord(fprarray.add(fpr*8 + 4));	  fpr += 1;	}	long doubleBits = (((long)hiword) << 32) | (loword & 0xFFFFFFFFL);	if (argTypes[i].isFloatType()) {	  argObjectArray[i] = VM_Reflection.wrapFloat((float)(Double.longBitsToDouble(doubleBits)));	} else { // double type	  argObjectArray[i] = VM_Reflection.wrapDouble(Double.longBitsToDouble(doubleBits));	}		//		VM.sysWriteln("double "+Double.longBitsToDouble(doubleBits));	      } else if (argTypes[i].isLongType()) {	int loword, hiword;	if (gpr > LAST_OS_PARAMETER_GPR-1) {	  // overflow, OTHER	  // round overflowoffset, assuming overflowarea is aligned to 8 bytes	  overflowoffset = (overflowoffset + 7) & -8;	  hiword = VM_Magic.getMemoryWord(overflowarea.add(overflowoffset));	  overflowoffset += 4;	  loword = VM_Magic.getMemoryWord(overflowarea.add(overflowoffset));	  overflowoffset += 4;	  	  // va-ppc.h makes last gpr useless	  gpr = 11;	} else {	  gpr += (gpr + 1) & 0x01;  // if gpr is even, gpr += 1	  hiword = VM_Magic.getMemoryWord(gprarray.add(gpr*4));	  loword = VM_Magic.getMemoryWord(gprarray.add((gpr+1)*4));	  gpr += 2;	}	long longBits = (((long)hiword) << 32) | (loword & 0xFFFFFFFFL);	argObjectArray[i] = VM_Reflection.wrapLong(longBits);		//		VM.sysWriteln("long 0x"+Long.toHexString(longBits));      } else {	// int type left now	int ivalue;	if (gpr > LAST_OS_PARAMETER_GPR) {	  // overflow, OTHER	  ivalue = VM_Magic.getMemoryWord(overflowarea.add(overflowoffset));	  overflowoffset += 4;	} else {	  ivalue = VM_Magic.getMemoryWord(gprarray.add(gpr*4));	  gpr += 1;	} 		//		VM.sysWriteln("int "+ivalue);		if (argTypes[i].isBooleanType()) {	  argObjectArray[i] = VM_Reflection.wrapBoolean(ivalue);	} else if (argTypes[i].isByteType()) {	  argObjectArray[i] = VM_Reflection.wrapByte((byte)ivalue);	} else if (argTypes[i].isShortType()) {	  argObjectArray[i] = VM_Reflection.wrapShort((short)ivalue);	} else if (argTypes[i].isCharType()) {	  argObjectArray[i] = VM_Reflection.wrapChar((char)ivalue);	} else if (argTypes[i].isIntType()) {	  argObjectArray[i] = VM_Reflection.wrapInt(ivalue);	} else if (argTypes[i].isReferenceType()) {	  argObjectArray[i] = env.getJNIRef(ivalue);	} else {	  if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED);	}      }    }  }