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