Правильно ли я понимаю, что на x86 в Си, при использовании соглашений вызова stdcall и cdecl, агрегированные типы данных размером до 64 бит возвращаются в EAX+EDX, то есть это, фактически, unsigned long long, а размером более 64 бит - через первый(неявный) параметр-указатель на предварительно выделенное место(скажем, на стеке) под выходное значение, который и возвращается.
И, особенно, что интересует - правильно ли, что на x86-64 такие возвращаемые значения передаются аналогично x86, за исключением такой детали(незначительной), что значение до 64 бит передается в RAX(а больше - аналогично x86).
Что еще интересует - значения агрегированных типов со строго заданным alignment при передаче параметров в функцию на стеке тоже выравниваются в соответствии с ним?
Я тут пишу продвинутый FFI для CL, который, кроме прочего, маршалит агрегированные типы данных:
http://github.com/Lovesan/virgil
И вот я решил в нем добавить by-value передачу значений таких типов в функции, соответственно возникли вышеописанные вопросы.