x64 вызывая вопрос Конвенции
(Microsoft) x64 соглашение о вызовах гласит:
Аргументы передаются в регистрах RCX, RDX, R8 и R9. Если аргументы float / double, они передаются в XMM0L, XMM1L, XMM2L и XMM3L.
Это здорово, но почему просто плавает/удваивается? Почему целые числа (и, возможно, указатели) также не передаются через регистры XMM?
Похоже на пустую трату свободного пространства, не так ли?
1 ответ:
Потому что большинство операций над не-FP значениями (т. е. целыми числами и адресами) предназначены для использования регистров общего назначения.
Существуют целочисленные операции SSE, но они являются только арифметическими.
Таким образом, если бы соглашение о вызове поддерживало передачу целых чисел и адресов через регистры SSE, почти всегда было бы необходимо скопировать значение в регистры общего назначения.