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?