Beispiel #1
0
        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;
            }
        }