64-битное деление на 32-битное - PullRequest
6 голосов
/ 13 августа 2010

Я ищу быстрый способ выполнения следующего деления:

  • Дивиденд - это 64-разрядное целое число со знаком.
  • Делитель - 32-разрядное целое число со знаком.
  • Частное должно быть 64-разрядным целым числом со знаком, остаток не требуется.
  • Низкое слово дивиденда равно нулю.

Я использую только 32битовые типы данных, так как 64-битные типы плохо поддерживаются компилятором, и нет сборки.Точность может быть несколько скомпрометирована в пользу скорости.

Есть ли какие-нибудь указатели на этом?

1 Ответ

2 голосов
/ 13 августа 2010

64/32 деление поддерживается напрямую i386 и, возможно, другими машинами, если старшее слово дивиденда меньше делителя (т.е. дивиденд находится в диапазоне 32x32-> 64, умноженного на делитель),Если ваш компилятор имеет минимальную поддержку для 64-битных типов, он может распознать эту ситуацию и воспользоваться ею.

Предполагая, что вы уже проверили сгенерированный asm и обнаружили, что он этим не пользуется, или если вы знаете, что у вашего процессора нет такой инструкции по разделению, то вам просто нужно провести длительное разделение, как вы учили в начальной школе ... за исключением того, что это base-4294967296 вместо base-10.

Выможет попытаться прочитать исходный код в libgcc, поскольку он содержит код для разделения 64/64 для машин, у которых нет встроенной поддержки.

Редактировать: На самом деле, поскольку у вас нет деления 64/32операция, вы можете использовать base-65536.Это связано с тем, что наивное длинное деление требует деления двухзначного числа на однозначное число на каждом шаге.Конечно, теперь вы застряли, делая больше шагов ..

...