Я пишу программу шифрования, и ядро (широкая процедура умножения) написано на x86-64 ассемблер, как для скорости, так и потому, что он широко использует такие инструкции, как adc
, которые нелегко доступны из C. Я не хочу встраивать эту функцию, потому что она большая и вызывается несколько раз во внутреннем цикле.
В идеале я также хотел бы определить пользовательское соглашение о вызовах для этой функции, потому что внутренне она использует все регистры (кроме rsp
), не затирает свои аргументы и возвращает значения в регистрах. Прямо сейчас он адаптирован к соглашению о вызовах C, но, конечно, это делает его медленнее (примерно на 10%).
Чтобы избежать этого, я могу вызвать его с помощью asm ("call% Pn": .. .: my_function ...: "cc", все регистры);
но есть ли способ сообщить GCC, что инструкция вызова мешает стеку? В противном случае GCC просто поместит все эти регистры в красную зону, а верхний будет сброшен. Я могу скомпилировать весь модуль с помощью -mno-red-zone, но я бы предпочел способ сообщить GCC, что, скажем, верхние 8 байтов красной зоны будут затерты, так что он ничего туда не поместит.