Это (AFAIK) конкретный вопрос в this общая тема .
Вот ситуация:
У меня есть встроенная система (игровая консоль), основанная на 32-битном микроконтроллере RISC (вариант NEC V810). Я хочу написать математическую библиотеку с фиксированной точкой. Я прочитал эту статью , но сопутствующий исходный код написан на ассемблере 386, поэтому его нельзя использовать напрямую и легко изменять.
V810 имеет встроенное целочисленное умножение / деление, но я хочу использовать формат 18.14, упомянутый в вышеупомянутой статье. Это требует деления 64-битного int на 32-битное int, а V810 выполняет только (со знаком или без знака) 32-битное / 32-битное деление (которое дает 32-битное частное и 32-битный остаток).
Итак, мой вопрос: как смоделировать 64-битное / 32-битное деление с 32-битным / 32-битным (чтобы учесть предварительный сдвиг делимого)? Или, если взглянуть на проблему с другой стороны, как лучше всего разделить фиксированную точку 18,14 на другую, используя стандартные 32-битные арифметические / логические операции? («лучший» означает самый быстрый, самый маленький или оба).
Алгебра, ассемблер (V810) и псевдокод - все в порядке. Я буду называть код из C.
Заранее спасибо!
РЕДАКТИРОВАТЬ: Как-то я пропустил этот вопрос ...Тем не менее, он все равно потребует некоторых модификаций, чтобы он был сверхэффективным (он должен быть быстрее, чем div с плавающей запятой, предоставляемый v810, хотя он уже может быть ...), поэтому не стесняйтесь выполнять мою работу за меня в обмен на очки репутации;) (и, конечно, упоминание в документации моей библиотеки).
GCC имеет такую подпрограмму для многих процессоров, называемую _divdi3 (обычно реализуется с помощью обычного вызова divmod). Вот один. Некоторые ядра Unix также имеют реализацию, например. FreeBSD.