как я могу получить инструкцию ARM MULL для вывода в uint64_t в gcc? - PullRequest
4 голосов
/ 03 февраля 2010

Я хотел бы ввести некоторый ассемблерный код в кодовую базу c99.Я хочу использовать инструкцию UMULL от процессора ARM, чтобы умножить 2 uint32_t и получить результат немедленно в uint64_t.

Теперь uint64_t нужно 2 регистра, так как мне указать выходные данные и ограничения ассемблераблок

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

Хороший вопрос!

Следующий код выводит то, что вы хотите, используя 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, это дает оптимизатору шанс сделать больше и будет добрее для читателей вашей программы.

1 голос
/ 03 февраля 2010

Команда umull выводит свои результаты в два 32-битных регистра.Я предлагаю явно пересобрать 64-битное значение примерно следующим образом:

/* assuming the 64-bit result was stored in "hi" (upper
   half) and "lo" (lower half) */
uint64_t v = ((uint64_t)hi << 32) | (uint64_t)lo;

Оптимизатор компилятора должен заметить, что сдвиг влево - это чистая маршрутизация данных, и полученный код должен быть в порядке.Чтобы быть уверенным, просто используйте -S, чтобы проверить вывод компилятора.

...