public abstract GetTypeRequirements ( |
||
typeLayout | The type layouts. | |
type | MosaType | The type. |
size | int | Receives the memory size of the type. |
alignment | int | Receives alignment requirements of the type. |
Résultat | void |
/// <summary> /// Calculates the stack size for parameters. /// </summary> /// <param name="typeLayout">The type layouts.</param> /// <param name="operands">The operands.</param> /// <param name="method">The method.</param> /// <returns></returns> protected static int CalculateStackSizeForParameters(MosaTypeLayout typeLayout, BaseArchitecture architecture, List <Operand> operands, MosaMethod method) { Debug.Assert((method.Signature.Parameters.Count + (method.HasThis ? 1 : 0) == operands.Count) || (method.DeclaringType.IsDelegate && method.Signature.Parameters.Count == operands.Count), method.FullName); int offset = method.Signature.Parameters.Count - operands.Count; int result = 0; for (int index = operands.Count - 1; index >= 0; index--) { Operand operand = operands[index]; int size, alignment; architecture.GetTypeRequirements(typeLayout, operand.Type, out size, out alignment); var param = (index + offset >= 0) ? method.Signature.Parameters[index + offset] : null; if (param != null && operand.IsR8 && param.ParameterType.IsR4) { // adjust for parameter size on stack when method parameter is R4 while the calling variable is R8 architecture.GetTypeRequirements(typeLayout, param.ParameterType, out size, out alignment); } result = (int)Alignment.AlignUp(result, (uint)alignment) + size; } return(result); }
protected static int CalculateStackSizeForParameters(MosaTypeLayout typeLayout, BaseArchitecture architecture, List <Operand> operands) { // first operand is the call location int result = 0; foreach (var operand in operands) { int size, alignment; architecture.GetTypeRequirements(typeLayout, operand.Type, out size, out alignment); result = Alignment.AlignUp(result, alignment) + size; } return(result); }
protected static int CalculateStackSizeForParameters(MosaTypeLayout typeLayout, BaseArchitecture architecture, List<Operand> operands) { // first operand is the call location int result = 0; foreach (var operand in operands) { int size, alignment; architecture.GetTypeRequirements(typeLayout, operand.Type, out size, out alignment); result = Alignment.AlignUp(result, alignment) + size; } return result; }
/// <summary> /// Calculates the stack size for parameters. /// </summary> /// <param name="typeLayout">The type layouts.</param> /// <param name="operands">The operands.</param> /// <param name="method">The method.</param> /// <returns></returns> protected static int CalculateStackSizeForParameters(MosaTypeLayout typeLayout, BaseArchitecture architecture, List<Operand> operands, MosaMethod method) { Debug.Assert((method.Signature.Parameters.Count + (method.HasThis ? 1 : 0) == operands.Count) || (method.DeclaringType.IsDelegate && method.Signature.Parameters.Count == operands.Count), method.FullName); int offset = method.Signature.Parameters.Count - operands.Count; int result = 0; for (int index = operands.Count - 1; index >= 0; index--) { Operand operand = operands[index]; int size, alignment; architecture.GetTypeRequirements(typeLayout, operand.Type, out size, out alignment); var param = (index + offset >= 0) ? method.Signature.Parameters[index + offset] : null; if (param != null && operand.IsR8 && param.ParameterType.IsR4) { // adjust for parameter size on stack when method parameter is R4 while the calling variable is R8 architecture.GetTypeRequirements(typeLayout, param.ParameterType, out size, out alignment); } result = (int)Alignment.AlignUp(result, (uint)alignment) + size; } return result; }
/// <summary> /// Calculates the stack size for parameters. /// </summary> /// <param name="typeLayout">The type layouts.</param> /// <param name="operands">The operands.</param> /// <param name="method">The method.</param> /// <returns></returns> protected static int CalculateStackSizeForParameters(MosaTypeLayout typeLayout, BaseArchitecture architecture, List<Operand> operands, MosaMethod method) { Debug.Assert((method.Signature.Parameters.Count + (method.HasThis ? 1 : 0) == operands.Count) || (method.DeclaringType.IsDelegate && method.Signature.Parameters.Count == operands.Count)); int offset = method.Signature.Parameters.Count - operands.Count; int result = 0; for (int index = operands.Count - 1; index >= 0; index--) { Operand operand = operands[index]; int size, alignment; architecture.GetTypeRequirements(typeLayout, operand.Type, out size, out alignment); var param = (index + offset >= 0) ? method.Signature.Parameters[index + offset] : null; if (param != null && operand.IsR8 && param.Type.IsR4) architecture.GetTypeRequirements(typeLayout, param.Type, out size, out alignment); if (size < alignment) size = alignment; result += size; } return result; }