X86-64 передает float и int в качестве аргументов - PullRequest
0 голосов
/ 22 марта 2019

При передаче значения с плавающей точкой в ​​качестве первого аргумента устанавливается регистр% xmm0. Что если мы хотим передать целое число в качестве второго аргумента в функции. Какой из% rdi или% rsi получает аргумент?

например. avg (float f, int i)

Сохранен ли порядок, так что% rsi получит int?

Редактировать: это машина с Ubuntu.

1 Ответ

3 голосов
/ 22 марта 2019

аргументы с плавающей точкой не отводят проходящие через аргументы слоты от аргументов целых чисел / указателей в соглашении о вызовах System V. x86-64.

Все, что имеет значение, это то, чтопервое целое число / указатель arg, который является кандидатом для передачи в регистр GP, поэтому он идет в RDI.(На самом деле EDI, старшие 32 бита RDI могут быть мусором.)

Большие структуры (передаваемые в память) также не убирают слоты для передачи аргументов, но маленькие структуры упаковываются в до 2целочисленные регистры.См. Документ ABI, или, проще, просто посмотрите на вывод компилятора.


В Windows x64, в отличие от , логика для назначения аргументов регистрам в значительной степени отличается, потому чтоих соглашение о вызовах делает различные варианты дизайна (оптимизированные для функций с переменным числом, а не для эффективности обычных функций.)

i - это 2-й аргумент в целом, поэтому его можно передать в регистр.А поскольку оно целочисленное, оно заносится в регистр GP, в частности в RDX.(Собственно EDX).Windows x64 передает первые 4 аргумента в RCX или XMM0, RDX или XMM1, R8 или XMM2, R9 или XMM3.

...