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 будет содержать контрольную сумму.