if (VM.VerifyAssertions) VM.assert(fieldRef.getSize() == 8);
if (VM.VerifyAssertions) VM._assert(fieldRef.getSize() == 8);
  protected final void emit_resolved_putfield(VM_Field fieldRef) {    int fieldOffset = fieldRef.getOffset();    if (VM_Collector.NEEDS_WRITE_BARRIER && !fieldRef.getType().isPrimitiveType()) {      VM_Barriers.compilePutfieldBarrier(asm, spSaveAreaOffset, fieldOffset);    }    if (!(VM.BuildForStrongVolatileSemantics && fieldRef.isVolatile())) { // normal case      if (fieldRef.getSize() == 4) { // field is one word	asm.emitL  (T1, 4, SP); // T1 = object reference	asm.emitL  (T0, 0, SP); // T0 = value	asm.emitCAL(SP, 8, SP);  	if (!(VM.BuildForConcurrentGC && !fieldRef.getType().isPrimitiveType())) { // normal case	  asm.emitST (T0, fieldOffset, T1);	} else {	// barrier needed for reference counting GC	  //-#if RVM_WITH_CONCURRENT_GC	  VM_RCBarriers.compilePutfieldBarrier(asm, spSaveAreaOffset, fieldOffset, method, fieldRef);	  //-#endif	}      } else { // field is two words (double or long)	if (VM.VerifyAssertions) VM.assert(fieldRef.getSize() == 8);	asm.emitLFD (F0,  0, SP); // F0 = doubleword value	asm.emitL   (T1,  8, SP); // T1 = object reference	asm.emitCAL (SP, 12, SP);	asm.emitSTFD(F0, fieldOffset, T1);      }    } else {		// strong volatiles case      if (fieldRef.getSize() == 4) { // field is one word	asm.emitL  (T1, 4, SP);                // T1 = object to update	asm.emitL  (T0, 0, SP);                // T0 = new value	asm.emitCAL(SP, 8, SP);                // pop stack	if (VM.BuildForConcurrentGC && ! fieldRef.getType().isPrimitiveType()) {	  //-#if RVM_WITH_CONCURRENT_GC // because VM_RCBarriers not available for non concurrent GC builds	  VM_RCBarriers.compilePutfieldBarrier(asm, spSaveAreaOffset, fieldOffset, method, fieldRef);	  //-#endif	} else { // see Appendix E of PowerPC Microprocessor Family: The Programming Environments	  asm.emitCAL   (T1, fieldOffset, T1); // T1 = pointer to slot	  int label = asm.getMachineCodeIndex();	  asm.emitLWARX (S0, 0, T1);           // S0 = old value	  asm.emitSTWCXr(T0, 0, T1);           // atomically replace with new value (T0)	  asm.emitBC    (NE, label);           // retry, if reservation lost	}	// asm.emitSYNC(); // to make putfield of a volatile field a write barrier uncomment this line (Note this is untested and the Opt compiler must also behave.))      } else { // volatile field is two words (double or long)	if (VM.VerifyAssertions) VM.assert(fieldRef.getSize() == 8);	asm.emitLtoc  (T0, VM_Entrypoints.doublewordVolatileMutexField.getOffset());	VM_ObjectModel.baselineEmitLoadTIB(asm, T1, T0);	asm.emitL     (S0, VM_Entrypoints.processorLockMethod.getOffset(), T1);	asm.emitMTLR  (S0);	asm.emitCall  (spSaveAreaOffset);	asm.emitLFD   (F0,  0, SP);	asm.emitL     (T1,  8, SP);	asm.emitCAL   (SP, 12, SP);	asm.emitSTFD  (F0, fieldOffset, T1);	asm.emitLtoc  (T0, VM_Entrypoints.doublewordVolatileMutexField.getOffset());	VM_ObjectModel.baselineEmitLoadTIB(asm, T1, T0);	asm.emitL     (S0, VM_Entrypoints.processorUnlockMethod.getOffset(), T1);	asm.emitMTLR  (S0);	asm.emitCall  (spSaveAreaOffset);      }    }  }