VM_Barriers.compilePutfieldBarrier(asm, fieldRef.getOffset());
VM_Barriers.compilePutfieldBarrierImm(asm, fieldRef.getOffset());
  protected final void emit_resolved_putfield(VM_Field fieldRef) {    if (VM_Interface.NEEDS_WRITE_BARRIER && !fieldRef.getType().isPrimitiveType()) {      VM_Barriers.compilePutfieldBarrier(asm, fieldRef.getOffset());    }    int fieldOffset = fieldRef.getOffset();    if (fieldRef.getSize() == 4) { // field is one word      asm.emitMOV_Reg_RegDisp(T0, SP, 0);           // T0 is the value to be stored      asm.emitMOV_Reg_RegDisp(S0, SP, 4);           // S0 is the object reference      asm.emitMOV_RegDisp_Reg(S0, fieldOffset, T0); // [S0+fieldOffset] <- T0      asm.emitADD_Reg_Imm(SP, WORDSIZE*2);          // complete popping the value and reference    } else { // field is two words (double or long)      if (VM.VerifyAssertions) VM._assert(fieldRef.getSize() == 8);      // TODO!! use 8-byte move if possible      asm.emitMOV_Reg_RegDisp(T0, SP, 0);                    // T0 is low part of the value to be stored      asm.emitMOV_Reg_RegDisp(T1, SP, 4);                    // T1 is high part of the value to be stored      asm.emitMOV_Reg_RegDisp(S0, SP, 8);                    // S0 is the object reference      asm.emitMOV_RegDisp_Reg(S0, fieldOffset, T0);          // store low part      asm.emitMOV_RegDisp_Reg(S0, fieldOffset+WORDSIZE, T1); // store high part      asm.emitADD_Reg_Imm(SP, WORDSIZE*3);                   // complete popping the values and reference    }  }