Return values that can fit into 64-bits are returned through RAX (including __m64 types), except for , , , floats, and doubles, which are returned in XMM0. If the return value does not fit within 64 bits, then the caller assumes the responsibility of allocating and passing a pointer for the return value as the first argument. Subsequent arguments are then shifted one argument to the right. That same pointer must be returned by the callee in RAX. User defined types to be returned must be 1, 2, 4, 8, 16, 32, or 64 bits in length.