public void Generate(ICallingConventionEmitter ccr, DataType?dtRet, DataType?dtThis, List <DataType> dtParams) { ccr.LowLevelDetails(stackAlignment, retSizeOnStack); ccr.CallerCleanup(retSizeOnStack); int iReg = 0; if (dtThis != null) { ccr.ImplicitThisRegister(iArgs[iReg++]); } foreach (var dtParam in dtParams) { if (iReg < iArgs.Length) { ccr.RegParam(iArgs[iReg++]); } else { ccr.StackParam(dtParam); } } if (dtRet != null) { ccr.RegReturn(Registers.eax); } }
/// <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(); }
// https://en.wikipedia.org/wiki/Calling_convention#SuperH // https://www.renesas.com/en-eu/doc/products/tool/001/rej10b0152_sh.pdf public void Generate(ICallingConventionEmitter ccr, DataType dtRet, DataType dtThis, List <DataType> dtParams) { ccr.LowLevelDetails(4, 0x14); if (dtRet != null && !(dtRet is VoidType)) { RegisterStorage reg; var pt = dtRet as PrimitiveType; if (pt != null && pt.Domain == Domain.Real) { if (pt.Size == 4) { reg = arch.GetRegister("fr0"); } else { reg = arch.GetRegister("dr0"); } ccr.RegReturn(reg); } else { if (dtRet.Size > 4) { throw new NotImplementedException(); } else { ccr.RegReturn(arch.GetRegister("r0")); } } } int ir = 0; int fr = 0; if (dtThis != null) { ccr.ImplicitThisRegister(iregs[ir]); ++ir; } foreach (var dtParam in dtParams) { var pt = dtParam as PrimitiveType; if (pt != null && pt.Domain == Domain.Real) { if (pt.Size == 4) { if (fr < fregs.Length) { ccr.RegParam(fregs[fr]); ++fr; } else { ccr.StackParam(dtParam); } } else { var dr = (fr + 1) >> 1; if (dr < dregs.Length) { ccr.RegParam(dregs[dr]); fr = 2 * (dr + 1); } else { ccr.StackParam(dtParam); } } } else if (ir >= iregs.Length || dtParam.Size > 4) { ccr.StackParam(dtParam); } else { ccr.RegParam(iregs[ir]); ++ir; } } }