 be large enough to hold the
     result, no smaller than the system register size (generally 32 or
     64 bits), and must be suitably aligned; it is the caller's
     responsibility to ensure this.  If CIF declares that the function
     returns 'void' (using 'ffi_type_void'), then RVALUE is ignored.

     In most situations, 'libffi' will handle promotion according to the
     ABI. However, for historical reasons, there is a special case with
     return values that must be handled by your code.  In particular,
     for integral (not 'struct') types that are narrower than the system
     register size, the return value will be widened by 'libffi'.
     'libffi' provides a type, 'ffi_arg', that can be used as the return
     type.  For example, if the CIF was defined with a return type of
     'char', 'libffi' will try to store a full 'ffi_arg' into the return
     value.

     AVALUES is a vector of 'void *' pointers that point to the memory
     locations holding the argument values for a call.  If CIF declares
     that the function has no arguments (i.e., NARGS was 0), then
     AVALUES is ignored.  Note that argument values may be modified by
     the callee (for instance, structs passed by value); the burden of
     copying pass-by-value arguments is placed on the caller.

     Note that while the return value must be register-sized, arguments
     should exactly match their declared type.  For example, if an
     argument is a 'short', then the entry in AVALUES should point to an
     object declared as 'short'; but if the return type is 'short', then
     RVALUE should point to an object declared as a larger type -
     usually 'ffi_arg'.

