Как я могу выполнить 64-битное деление с помощью 32-битной инструкции деления?

Это (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, хотя он уже может быть ...), поэтому не стесняйтесь выполнять мою работу за меня в обмен на очки репутации;) (и, конечно, упоминание в документации моей библиотеки).

10
задан Community 23 May 2017 в 12:18
поделиться

1 ответ

GCC имеет такую ​​подпрограмму для многих процессоров, называемую _divdi3 (обычно реализуется с помощью обычного вызова divmod). Вот один. Некоторые ядра Unix также имеют реализацию, например. FreeBSD.

6
ответ дан 4 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: