Целочисленный остаток от деления без деления.

Тема в разделе "WASM.A&O", создана пользователем cppasm, 15 окт 2007.

  1. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Привет.
    Нет ли каких хитрых алгоритмов для вычисления остатка от деления не выполнения деление?
    Конкретно надо посчитать x=x mod 0xFFFFFFFE для 32-битного х;
    Желательно без условных переходов и SETcc...
    Если с переходом то можно что-нибудь типа:

    Код (Text):
    1.    cmp   eax,0FFFFFFFEh
    2.    jb    @@below
    3.    sub   eax,0FFFFFFFEh
    4. @@below:
    Без перехода сочинил такое:

    Код (Text):
    1. mov   edx,eax
    2. xor   ecx,ecx
    3. sub   edx,0FFFFFFFEh
    4. adc   eax,ecx
    5. adc   eax,ecx
    Вопрос - какой из вариантов будет быстрее?
    Вообще хотелось бы как-нибудь улучшить второй вариант...
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Код (Text):
    1. mov eax, x
    2. and eax, 1
    но это только по мод 0FFFFFFFEh
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Код (Text):
    1. mov     edx, eax
    2. sub     edx, -2
    3. cmovnb  eax, edx
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    wsd
    :) Это по модулю 2
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    wsd - это не то.
    KeSqueer - я что-то подобное с SETcc придумал, но хочется без комплексных инструкций.
    Точнее желательно на одной арифметике.
    В общем почему мне мой вариант не нравится.
    Это дело надо запихнуть в Сишный исходник, а ADC там не напишеш.
    Вставку ассемблерную делать неохота - на крайний случай разве что.
    А компилятор лопух DIV прихает.
    Вот надо как-то извратиться...
     
  7. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    http://www.cs.utk.edu/~vose/c-stuff/bithacks.html#ModulusDivision //хотя тут цикл есть - но в любом случае позновательно =))
    http://www.azillionmonkeys.com/qed/adiv.html
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    KeSqueer

    а если переменная будет 0ffffffffh
    что даст Ваш алгоритм?
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    nobodyzzz - спасибо, ущёл читать.
    На первый взгляд то что нужно.
    wsd - а что даст?
    Единицу как и должен.
     
  10. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    cppasm
    Да я при анализе(0ffffffffh) что-то sub edx, -2 как в математике приравнял edx-(-2)=edx+2=add edx, 2 и у меня соответственно CF поднялся:dntknw:
    да прогнал два раза...
    надо мне наконец хорошо выспаться.
    сильно не ругайте:)
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    wsd
    Бывает))
     
  12. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    абсолютно обойтись без деления невозможно.......