Я пытаюсь понять использование "ранних выходов", но наткнулся на отрывок, который смущает меня. Рассмотрим следующую функцию умножения по модулю:
static inline uint64_t mulmod64(uint64_t a, uint64_t b, uint64_t n)
{
uint64_t d;
uint64_t unused;
asm ("mulq %3\n\t"
"divq %4"
:"=a"(unused), "=&d"(d)
:"a"(a), "rm"(b), "rm"(n)
:"cc");
return d;
}
Почему RDX
имеет флаг раннего клоббера (&
)? Это потому что mulq
неявно изменено RDX
? Будет ли пример работать без флага? (Я пытался, и, похоже, так и есть. Но будет ли это правильно?) С другой стороны, разве недостаточно, чтобы функция выводила RDX
, чтобы сообщить, что компилятор RDX
был изменен?
Кроме того, почему существует эта unused
переменная? Я предполагаю, что это означает, что RAX
был изменен, правильно? Могу ли я удалить это? (Я попытался, и это, кажется, работает.) Я ожидал, что правильный способ пометить измененный RAX
- это включить "rax"
в "clobbers" вместе с "cc"
. Но это не работает.