# dmd.argtypes_aarch64

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

#### Authors

Martin Kinkelin

#### License

Boost License 1.0

Source: argtypes_aarch64.d

Documentation: https://dlang.org/phobos/dmd_argtypes_aarch64.html

Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/argtypes_aarch64.d

- `toArgTypes_aarch64`

  #### 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 https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst.

  #### Parameters

  `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`.

- `isHFVA`

  #### 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.

  #### Discussion

  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.