public static void SetReturnStorage(ICallingConventionEmitter ccr, DataType?dtRet, int stackAlignment) { if (dtRet == null) { return; } int retSize = dtRet.Size; if (retSize > 8) { // returns a pointer to the stack-allocated large return value ccr.RegReturn(Registers.eax); return; } else { var pt = dtRet.ResolveAs <PrimitiveType>(); if (pt != null && pt.Domain == Domain.Real) { ccr.FpuReturn(-1, PrimitiveType.Real64); return; } if (retSize > 4) { ccr.SequenceReturn(Registers.edx, Registers.eax); return; } if (retSize > 2) { if (stackAlignment == 4) { ccr.RegReturn(Registers.eax); } else { ccr.SequenceReturn(Registers.dx, Registers.ax); } return; } if (retSize > 1) { ccr.RegReturn(Registers.ax); return; } ccr.RegReturn(Registers.al); return; } }