Я пытаюсь использовать следующий макрос:
#define M_MA(out, L_v, var1, var2)({ \
asm volatile( \
"movswl %2, %%edi\n\t" \
"movswl %3, %%ebx\n\t" \
"imull %%edi, %%ebx\n\t" \
"sall $1,%%ebx\n\t" \
"cmpl %4,%%ebx\n\t" \
"cmove %5,%%ebx\n\t" \
"addl %1, %%ebx\n\t" \
"jno out%=\n\t" \
"cmovg %5, %%ebx\n\t" \
"cmovl %4, %%ebx\n\t" \
"out%=: nop\n\t" \
"movl %%ebx, %0\n\t" : "=r"(out) : "r"(L_v), "m"(var1), "m"(var2), "r"(-2147483648), "r"(+2147483647) : "%ebx","%edi"); })
Когда он используется внутри файла, скомпилированного с использованием оптимизаций, я получаю:
error: ‘asm’ operand has impossible constraints
var1 и var2 - 16-битные слова. out и L_v являются 32-битными словами.
После некоторого чтения я думаю, что проблема в том, что компилятору нужно больше регистров, чем доступно, но я не уверен в этом.Если это проблема, я понятия не имею, как использовать меньше регистров, чем сейчас, или как исправить ошибку.
Я использую gcc поверх Linux на 32-битной платформе.
Любой может уточнитьчто-то об этом?
С уважением