Break down a D type into basic (register) types for the AArch64 ABI.


Martin Kinkelin

  • Declaration

    TypeTuple toArgTypes_aarch64(Type t);

    This breaks a type down into 'simpler' types that can be passed to a function in registers, and returned in registers. This is the implementation for the AAPCS64 ABI, based on


    Type t

    type to break down

    Return Value

    tuple of 1 type if t can be passed in registers; e.g., a static array for Homogeneous Floating-point/Vector Aggregates (HFVA). A tuple of zero length means the type cannot be passed/returned in registers. null indicates a void.

  • Declaration

    bool isHFVA(Type t, int maxNumElements = 4, Type* rewriteType = null);

    A Homogeneous Floating-point/Vector Aggregate (HFA/HVA) is an ARM/AArch64 concept that consists of up to 4 elements of the same floating point/vector type. It is the aggregate final data layout that matters so structs, unions, static arrays and complex numbers can result in an HFVA.


    simple HFAs: struct F1 {float f;} struct D4 {double a,b,c,d;} interesting HFA: struct {F1[2] vals; float weight;}

    If the type is an HFVA and rewriteType is specified, it is set to a corresponding static array type.