аргументы с плавающей точкой не отводят проходящие через аргументы слоты от аргументов целых чисел / указателей в соглашении о вызовах 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.