Хороший вопрос!
Следующий код выводит то, что вы хотите, используя GCC -O
или выше, не прибегая к ассемблеру:
uint32_t a, b;
uint64_t c;
...
c = (uint64_t)a * (uint64_t)b;
или если вы чувствуете, что должны использовать машинно-зависимый асм, вы можете перейти:
uint32_t a, b;
uint64_t c;
asm ("umull %Q0, %R0, %1, %2" : "=r"(c) : "r"(a), "r"(b));
Имя регистра
c
является первым из пары регистров, и% Q и% R выбирают нижний и верхний 32-битные регистры пары. Смотрите пример gcc / config / arm / arm.md -> umulsidi3.
Однако, если вы можете остаться в C, это дает оптимизатору шанс сделать больше и будет добрее для читателей вашей программы.