4.3. Cray
Ниже приводится ассемблерная реализация алгоритма для процессора Cray, которую предложил Charley Kline. Расчет контрольной суммы производится как векторная операция, обеспечивающая одновременное сложение до 512 байтов с базовым блоком суммирования 32 бита. Для простоты из примера исключены фрагменты, обеспечивающие возможность работы с короткими блоками.
Регистр A1 содержит адрес 512-байтового блока памяти для контрольной суммы. Две первых копии данных загружаются в два векторных регистра. Один вектор сдвигается вправо на 32 бита, а для второго используется операция AND с 32-битовой маской. После этого векторы складываются. Поскольку все эти операции связаны в цепочку, они дают один результат на каждый цикл процессора. Далее производится сжатие (collaps) результирующего вектора в цикле, который прибавляет каждый элемент к скалярному регистру. В заключение выполняется перенос и результат помещается в 16 битов.
EBM
A0 A1
VL 64 используются полные векторы
S1 <32 формируется 32-битовая маска из правой части.
A2 32
V1 ,A0,1 загрузка пакета в V1
V2 S1&V1 формирование "правых" 32 битов в V2.
V3 V1>A2 формирование "левых" 32 битов в V3.
V1 V2+V3 Сложение.
A2 63 Подготовка к сжатию в скаляр.
S1 0
S4 <16 Form 16-bit mask from the right.
A4 16
CK$LOOP S2 V1,A2
A2 A2-1
A0 A2
S1 S1+S2
JAN CK$LOOP
S2 S1&S4 формирование " правых" 16 битов в S2
S1 S1>A4 формирование " левых" 16 битов в S1
S1 S1+S2
S2 S1&S4 формирование " правых" 16 битов в S2
S1 S1>A4 формирование " левых" 16 битов в S1
S1 S1+S2
S1 #S1 Получение дополнения до 1
CMR В этой точке S1 будет содержать контрольную сумму.