Como digo ao GCC asm que um registro de entrada está bloqueado?

Estou tentando fazer uma multiplicação de 64 = 32x32 via x86mul instrução, mas eu só preciso da dword alta do resultado (oedx registo). Então, naturalmente, tentei listaredx como um registro de saída eeax como um registro derrotado.

Isso me parece natural, maseax éAlém disso um registro de entrada. Quando tento dizer ao GCC queeax for derrotado, ele fornece uma mensagem de erro.

__asm__("mull\t%2" : "=d"(div10) : "%a"(UINT32_C(0x1999999A)), "r"(number)
    : "cc", "rax");

Se eu tentar isso, ele lança esta mensagem de erro:

divmod10.cpp:76:91: error: can’t find a register in class ‘AREG’ while reloading
‘asm’
divmod10.cpp:76:91: error: ‘asm’ operand has impossible constraints

Omitir compila, mas quebra o código. O GCC acaba confiando emeax não está sendo derrotado, o que está incorreto:

        movl    $429496730, %eax
#APP
# 76 "divmod10.cpp" 1
        mull    %esi
# 0 "" 2
#NO_APP
        movl    %edx, %esi
#APP
# 78 "divmod10.cpp" 1
        mull    %edx
# 0 "" 2
#NO_APP

Como faço o que eu quero?

questionAnswers(1)

yourAnswerToTheQuestion