public void Generate(ICallingConventionEmitter ccr, DataType?dtRet, DataType?dtThis, List <DataType> dtParams) { ccr.LowLevelDetails(stackAlignment, retAddressOnStack); SetReturnStorage(ccr, dtRet, stackAlignment); if (dtThis != null) { ccr.ImplicitThisStack(dtThis); } if (reverseArguments) { for (int i = dtParams.Count - 1; i >= 0; --i) { ccr.StackParam(dtParams[i]); } ccr.ReverseParameters(); } else { for (int i = 0; i < dtParams.Count; ++i) { ccr.StackParam(dtParams[i]); } } if (callerCleanup) { ccr.CallerCleanup(retAddressOnStack); } else { ccr.CalleeCleanup(); } }
public void Generate(ICallingConventionEmitter ccr, DataType dtRet, DataType dtThis, List <DataType> dtParams) { ccr.LowLevelDetails(2, 4); for (int i = dtParams.Count - 1; i >= 0; --i) { ccr.StackParam(dtParams[i]); } ccr.ReverseParameters(); ccr.CalleeCleanup(); if (dtRet != null && !(dtRet is VoidType)) { ccr.StackReturn(dtRet); } }
/// <summary> /// If dtThis is supplied, it is known that it is the `this` /// corresponding to an enclosing C++ class. If dtThis is null, then /// the first of the dtParams will be treated as a `this`. /// </summary> public void Generate(ICallingConventionEmitter ccr, DataType dtRet, DataType dtThis, List <DataType> dtParams) { ccr.LowLevelDetails(stackAlignment, retAddressOnStack); X86CallingConvention.SetReturnStorage(ccr, dtRet, stackAlignment); int i = 0; if (dtThis != null) { ccr.ImplicitThisRegister(this.ecxThis); } else if (dtParams.Count > 0) { ccr.RegParam(this.ecxThis); i = 1; } for (; i < dtParams.Count; ++i) { ccr.StackParam(dtParams[i]); } ccr.CalleeCleanup(); }