Встроенная сборка, уничтожающая красную зону

Я пишу программу шифрования, и ядро ​​(широкая процедура умножения) написано на x86-64 ассемблер, как для скорости, так и потому, что он широко использует такие инструкции, как adc , которые нелегко доступны из C. Я не хочу встраивать эту функцию, потому что она большая и вызывается несколько раз во внутреннем цикле.

В идеале я также хотел бы определить пользовательское соглашение о вызовах для этой функции, потому что внутренне она использует все регистры (кроме rsp ), не затирает свои аргументы и возвращает значения в регистрах. Прямо сейчас он адаптирован к соглашению о вызовах C, но, конечно, это делает его медленнее (примерно на 10%).

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

20
задан fuz 26 June 2016 в 21:56
поделиться