· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Модулярная арифметика. Сложение.

Посл.отвђт Сообщенiе


Дата: Ноя 10, 2004 15:31:49

Речь идет о сложении чисел в системе остаточных классов. (см. Модулярная арифметика, например у Кнута или Система Остаточных Классов (СОК) (Юдицкий, Акушский)). Ссылка в тему: http://www.borz.ru/articles/sok/sok.html

Пусть в регистре xmm0 находится вектор модулей pv ( 16 модулей p[i] i=0...15 по байту на каждый), в регистре xmm1 находится вектор xv (остатки от деления некого числа X на сооветствующие модули)( x[i]=X mod(p[i]) ), а в регистре xmm2 аналогичный вектор yv ( y[i]=Y mod(p[i]) ).
Хочется максимально быстро получить в регистре xmm3 сумму xv+yv по модулю pv (z[i]=(x[i]+y[i]) mod(p[i]).

Код работающий у меня сейчас:

; xmm0 - p[i]
; xmm1 - x[i]
; xmm2 - y[i]
movdqa xmm3,xmm1
paddb xmm3,xmm2
movdqa xmm7,xmm3
pminub xmm7,xmm0
pcmpeqb xmm7,xmm0
pand xmm7,xmm0
psubb xmm3,xmm7 ; xmm3=z[i]=(x[i]+y[i]) mod(p[i])

Это работает при условии, что все p[i]<128, или p[i]=256
Если p[i]<64, то можно сделать быстрее:

movdqa xmm3,xmm1
paddb xmm3,xmm2
movdqa xmm7,xmm3
pcmpgtb xmm7,xmm0
pand xmm7,xmm0
psubb xmm3,xmm7 ; xmm3=z[i]=(x[i]+y[i]) mod(p[i])

Как бы посчитать это еще быстрее да и для любых p[i]<=256 ???


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057